线程的声明周期:
1. NEW
new 一个 Thread 对象时,如果没有调用 start 时,那么new的这个对象就相当于一个普通的java对象。
2. RUNNABLE
当调用 thread 的 start 时,才真正的在 jvm 进程中创建了一个线程,但是这个线程并不一定立即执行,需要等待 CPU 的调度。这个线程等待 CPU 调度的状态称为 RUNNABLE 状态。
3. RUNNING
一个正在执行自己业务逻辑的线程的状态称为 RUNNING 状态。该状态的线程可以发生如下的状态转换。
3.1 直接进入 TERMINATED 状态。比如调用 stop 方法。
3.2 进入 BLOCKED 状态。比如调用 sleep ,或者 wait 方法而加入 waitSet 中。
3.3 进行某个阻塞的 IO 操作,比如网络数据读写。
3.4 获取某个锁资源,从而加入该锁的阻塞队列中进入BLOCKED 状态。
3.5 由于 CPU 的调度轮询,使改线程放弃执行任务进入 RUNNABLE 状态。
3.6 线程主动调用 yield 方法,放弃 CPU 执行权,进入 RUNNABLE 状态。
4. BLOCKED
这个状态的线程可能进入到 TERMINATED 和 RUNNABLE状态。
如:
4.1 调用 stop 方法,进入TERMINATED 。
4.2 线程完成了指定的休眠时间,进入到了RUNNABLE。
4.3 wait中的线程被其它线程唤醒 notify/notifyall。进入到了RUNNABLE。
4.4 阻塞中的线程获取到了锁资源进入到了RUNNABLE。
4.5 线程在阻塞过程中被打断,比如其它线程调用了 interrupt 方法,进入RUNNABLE。
5. TERMINATED
这个状态是线程的最终状态,改状态的线程不会被切换到其它任何状态。
导致该状态的情况如下:
5.1 线程运行正常结束。
5.2 线程运行中意外出错。
5.3 JVM宕机,导致所有线程结束。
以上内容参考了java高并发变成详解一书。