6

我创建了一个简单的 Java 应用程序,它有一个 JFrame 和几个 JButton。当我尝试使用 JVMTI 检查 Java 应用程序时,我发现虽然我没有创建任何显式线程,但还是产生了很多线程。

我可以找到以下线程:

  • 销毁JavaVM
  • AWT-EventQueue-0
  • AWT-关机
  • AWT-XAWT- 守护线程
  • Java2D Disposer - 守护线程
  • Thread-0- 守护线程 [由 JVMTI 代理创建]
  • Signal Dispatcher - 守护线程
  • Finalize-守护线程
  • 参考处理程序 - 守护线程

它们中的大多数处于 Runnable 状态。有人能告诉我这些线程的功能吗?

4

2 回答 2

10

底层库使用这些线程来管理图形应用程序所需的小部件、显示、事件循环和其他管道。

GUI 应用程序通常有很多移动部件,如果您注意到您不必显式编写任何代码来管理这些部件(例如,更新屏幕、绘制按钮或处理鼠标移动)。是这组后台线程负责管理这些部分,并使您尽可能轻松地专注于您的应用程序逻辑。

这些线程由您使用的库(例如,AWT、Swing 等)产生,并且通常在终止时自行清理(以及它们管理的资源)。

于 2010-02-10T18:03:58.913 回答
2

我可以告诉你一个,你猜三个...

  • AWT-EventQueue-0

这是 GUI/Awt/Swing 线程。任何写入 GUI 的东西都必须在这个线程上执行!有时,如果我认为另一个线程可能正在写入 GUI,我会转到我认为可能发生争用的地方,并断言当前线程的名称与“AWT-EventQueue-0”匹配.

我真的希望 Sun 发布了一个库的“调试”版本,该版本在所有组件中断言正确的线程使用——它会省去很多麻烦,并避免 Java 遇到一个非常糟糕的 REP 导致 GUI 崩溃,而实际上是人不明白这个线程。

这些可能都与线程垃圾收集器有关:

  • Java2D Disposer - 守护线程
  • Finalize-守护线程
  • 参考处理程序 - 守护线程
于 2010-02-10T18:29:23.263 回答