接上篇《Java并发技术总结之二——ThreadLocal》
三. 线程状态
线程有六种状态:NEW, RUNNABLE(RUNNING), WAITING, TIME_WAITING, BLOCKED, TERMINATED。
3.1 NEW
线程刚刚被创建的时候,即 new Thread(),且尚未执行 start() 方法的状态;
3.2 RUNNABLE / RUNNING
RUNNABLE(或称 READY) 与 RUNNING 是线程已经准备执行或正在执行的状态,是线程执行了 start() 方法之后状态。线程处于 RUNNABLE 或者是 RUNNING 状态,取决于 CPU 的调度,获取了 CPU 使用权的线程处于 RUNNING 状态,否则处于就绪状态 (RUNNABLE)。进入该状态的方法如下:
- RUNNABLE -> RUNNING: CPU 调度后,获取 CPU 的使用权;
- RUNNING -> RUNNABLE: 失去 CPU 的使用权,回到就绪状态;
- NEW -> RUNNABLE: thread.start() 方法调用;
- WAITING -> RUNNABLE: notify/notifyAll 方法调用;
- TIME_WAITING -> RUNNABLE: notify/notifyAll 方法调用;
3.3 WAITING
WAITING 为等待状态,需要进行某些特定动作之后才能回到正常的运行状态,时间不确定 。进入该状态的方法如下:
- RUNNABLE -> WAITING: wait/join 方法调用;
3.4 TIME_WAITING
TIME_WAITING 同样为等待状态,也需要进行某些特定动作才能回到正常运行状态。与 WAITING 方法不同的是 TIME_WAITING 状态的时间是确定的。进入该状态的方法如下:
- RUNNABLE -> TIME_WAITING: sleep 方法调用;
3.5 BLOCKED
BLOCKED 状态是在获取锁过程中被阻塞的状态,通常用于 synchronized, lock 的使用场景中。进入该状态的方法如下:
- RUNNABLE -> BLOCKED: synchronized, lock 阻塞;
3.6 TERMINATED
TERMINATED 状态标志着一个线程的结束,处于 TERMINATED 状态的线程不能再转变为其他状态。进入该状态的方法如下:
- 线程正常的运行完毕;
- 线程运行抛出异常;
- JVM Crash,所有线程全部结束;