【问题标题】:What are these threads which are spwaned when a Java application begins its execution?当 Java 应用程序开始执行时,这些线程是什么?
【发布时间】:2011-01-15 09:37:36
【问题描述】:
我创建了一个简单的 Java 应用程序,它有一个 JFrame 和几个 JButton。当我尝试使用 JVMTI 检查 Java 应用程序时,我发现虽然我没有创建任何显式线程,但还是产生了很多线程。
我可以找到以下主题:
- 销毁JavaVM
- AWT-EventQueue-0
- AWT 关机
- AWT-XAWT- 守护线程
- Java2D Disposer- 守护线程
- Thread-0- 守护线程 [由 JVMTI 代理创建]
- 信号调度程序 - 守护线程
- Finalize- 守护线程
- 引用处理程序 - 守护线程
它们中的大多数处于 Runnable 状态。谁能告诉我这些线程的功能?
【问题讨论】:
标签:
java
multithreading
jvmti
【解决方案1】:
底层库使用这些线程来管理图形应用程序所需的小部件、显示、事件循环和其他管道。
GUI 应用程序通常有很多移动部件,如果您注意到您不必显式编写任何代码来管理这些部件(例如,更新屏幕、绘制按钮或处理鼠标)移动)。是这组后台线程负责管理这些部分,并让您尽可能轻松地专注于您的应用程序逻辑。
这些线程由您使用的库(例如 AWT、Swing 等)生成,并且通常会在终止时自行清理(以及它们管理的资源)。
【解决方案2】:
我可以告诉你一个,你猜三个......
这是 GUI/Awt/Swing 线程。任何写入 GUI 的东西都必须在这个线程上执行!有时,如果我认为另一个线程可能正在写入 GUI,我会转到我认为可能发生争用的地方,并断言当前线程的名称与“AWT-EventQueue-0”匹配.
我真希望 Sun 发布了一个“调试”版本的库,该版本在所有组件中断言正确的线程使用——它会省去很多麻烦,并使 Java 避免使用非常糟糕的 REP 导致 GUI 崩溃真的是不了解这个线程的人。
这些大概都和线程垃圾收集器有关:
- Java2D Disposer- 守护线程
- Finalize- 守护线程
- 引用处理程序 - 守护线程