我在下面的书中读到了<Core Java vol.1>:
每个Java应用程序都以在主线程中运行的main方法开始.在Swing程序中,主线程是短暂的.它在事件调度线程中调度用户界面的构造,然后退出... 其他线程(例如将事件发布到事件队列中的线程)在后台运行,但这些线程对于应用程序程序员是不可见的.
它让我觉得JVM使用一组标准线程来容纳每个Java程序.我认为它们包括:
我想这些线程就像JVM授予每个Java应用程序的堆空间,堆栈等其他资源一样.客户应该在不同的线程中正确地完成不同的工作.比如只在事件派发线程中做与Swing相关的事情.
我对此是否正确?我在哪里可以找到一些权威参考?JVM规范似乎没有这个.
如果我从不使用事件调度线程,例如在控制台应用程序中,我可以禁用它来节省一些CPU周期吗?
下面的链接解释了有关Swing框架如何使用线程的详细信息.
Swing中的并发性 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
看起来这是实现定义的,但HotSpot 具有以下内容:
VM线程
此线程等待出现需要JVM到达安全点的操作.这些操作必须在单独的线程上发生的原因是因为它们都需要JVM处于不能对堆进行修改的安全点.此线程执行的操作类型是"stop-the-world"垃圾收集,线程堆栈转储,线程挂起和偏向锁定撤销.
定期任务线程
该线程负责用于安排定期操作执行的定时器事件(即中断)
GC线程
这些线程支持JVM中发生的不同类型的垃圾回收活动
编译器线程
这些线程在运行时将字节代码编译为本机代码
信号调度程序线程
该线程接收发送到JVM进程的信号,并通过调用适当的JVM方法在JVM内处理它们.
除了您的代码生成的任何线程.
编辑以回应赏金(你是对的,有些人的博客是非常不稳定的支持,虽然它是我能找到所有摘要的最佳位置)--- OpenJDK对他们的运行时系统的描述(打算成为HotSpot的副本)描述了同样的事情:
人们常常惊讶地发现即使执行一个简单的"Hello World"程序也可能导致在系统中创建十几个或更多线程.它们来自内部VM线程和库相关线程(例如引用处理程序和终结器线程)的组合.主要的VM线程类型如下:
VM线程:VMThread的这个单例实例负责执行VM操作......
定期任务线程:WatcherThread的这个单例实例模拟用于在VM内执行定期操作的定时器中断
GC线程:这些不同类型的线程支持并行和并发垃圾回收
编译器线程:这些线程执行字节码到本机代码的运行时编译
信号调度程序线程:该线程等待进程定向信号并将它们分派给Java级信号处理方法
我找不到Oracle的任何参考资料,以确认它们的实现方式是相同的,但是来自Sun的Paul Hohenesee的演示文稿中的这些幻灯片提到:
线程类型
Java,又名mutator
一个VM线程:GC,去优化等
编译器
看守,计时器
低内存监视器
垃圾收集器,并行收集器
鉴于此演示文稿必须至少6年,实现可能略有改变,但组件或多或少相同.
这是打印活动线程的简单方法:
import java.util.Set;
public class ListThreads
{
public static void main(String[] args) throws InterruptedException
{
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for (Thread thread : threadSet)
System.out.println(thread.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
除了你的主线程,你会看到其他一些线程:
有时其中一个也是:
这些线程是"守护程序线程",这意味着它们不会阻止您的Java进程退出,即使它们没有完成.所以,你的"主"线程是唯一的非守护进程线程.
在Swing事件分派线程,是不是其中之一,并不会被默认启动.它只会在您开始使用Swing组件后启动.
所有这些线程都至关重要.只是接受他们的存在.它们对你有好处.
1)每个swing应用程序都是一个java应用程序.
但,
2)并非每个java应用程序都是swing应用程序.
这就是说JVM为每个 java应用程序提供了一个主线程.
在除了到每一次挥杆应用提供一个事件调度线程,由于摆动规范(的Java Swing API和开发者指南).
如果您不导入不需要的API,则无需担心停止不必要的启动线程.
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |