线程管理
线程管理涉及从线程创建到终止的整个生命周期,以及HotSpot VM线程间的协调。线程管理包括Java代码创建的线程、直接与HotSpot VM关联的本地线程,以及HotSpot为其他目的的而创建的内部线程。
线程模型
HotSpot VM的线程模型中,Java线程(java.lang.Thread实例)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程,当该Java线程终止时,这个操作系统线程也会被回收。Java线程的优先级和操作系统线程的优先级之间关系复杂,各个系统之间不尽相同。
线程创建和销毁
创建
HotSpot VM有两种引入线程的方式,执行Java代码时调用java.lang.Thread对象的start()方法,或者用JNI将已存在本地线程关联到HotSpot VM上。
- java.lang.Thread实例以Java代码形式表示线程
- HotSpot VM内部以C++类JavaThread的实例表示java.lang.Thread实例,它包含其他的线程状态追踪信息。
- OSThread实例代表操作系统进程,它包含了其他操作系统级别的线程状态追踪信息。
当java.lang.Thread启动时,HotSpot VM创建与之关联的JavaThread和OSThread对象,最后是本地线程。
销毁
本地线程初始化后开始执行启动方法,执行java.lang.Thread对象的run()方法,当它返回时,先处理所有未捕获的异常,之后终止该线程,然后与HotSpot VM交互,检查终止线程是否就要终止整个HotSpot VM。终止线程会释放所有已分配的资源,并从已知线程列表移除JavaThread,然后调用OSThread和JavaThread的析构函数,当它的初始启动方法完成时,最终停止运行。
线程状态
HotSpot VM使用多种不同的内部线程状态来表示线程正在做什么。执行不同的操作时,线程状态会发生跃迁,跃迁时会检查线程在该点处理请求的动作是否合适。
线程有如下状态:
- 新线程:线程正在初始化的过程中
- 线程在Java中:线程正在执行Java代码
- 线程在VM中:线程正在HotSpot VM中执行。
- 线程阻塞:线程因为某种原因(获取锁、等待条件、休眠、执行阻塞式I/O)
使用工具转储栈追踪信息后,可以看到这些线程状态信息(HotSpot内部C++对象OSThread维护): - MONTOR_WAIT:线程正在等待获取竞争的监视锁
- CONDVAR_WAIT:线程正在等待HotSpot VM使用的内部条件变量(没有和任何Java对象关联)
- OBJECT_WAIT:Java线程正在执行java.lang.Object.wait()。
VM内部线程
Java仅仅是一个“Hello World”程序执行时也会产生大量的线程,这些线程是由VM内部线程和VM库线程产生。VM内部线程(C++内部JavaThread的实例)如下:
- VM线程:是C++单例对象,负责执行VM操作。
- 周期任务线程:是C++单例对象,也称为WatcherThread,模拟计时器中断使得在HotSpot VM内可以执行周期性操作。
- 垃圾收集线程:支持串行、并行和并发垃圾收集
- JIT编译器线程:这些线程进行运行时编译,将字节码编译成机器码。
- 信号分发线程:这个线程等待进程发来信号并将他们分发给Java的信号处理办法