Java线程六种状态是反映运行行为的快照,转换由具体操作触发:NEW→RUNNABLE仅通过start();RUNNABLE可转BLOCKED、WAITING、TIMED_WAITING,满足条件后回RUNNABLE;正常或异常结束进入TERMINATED且不可逆。

Java 线程的六种核心状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)不是静态标签,而是反映线程在 JVM 中真实运行行为的快照。状态转换由具体操作触发,且每种转换都有明确的前提和副作用。
NEW → RUNNABLE:启动线程的唯一入口
仅当调用 start() 方法时发生。此时 JVM 为线程分配资源、注册调度,并将线程置入可调度队列。
- 重复调用
start()会立即抛出IllegalThreadStateException - 创建 Thread 对象但未调用
start(),始终停留在 NEW;run()方法直接调用不会改变状态,只是普通方法执行
RUNNABLE 与其他等待/阻塞状态的双向转换
RUNNABLE 是中心状态,几乎所有主动操作都从它出发,也几乎全部恢复都回到它。
-
RUNNABLE → BLOCKED:线程尝试进入
synchronized同步块或方法,但目标对象锁已被其他线程持有 -
RUNNABLE → WAITING:调用无超时参数的
Object.wait()、Thread.join()或LockSupport.park() -
RUNNABLE → TIMED_WAITING:调用
Thread.sleep(millis)、带超时的wait(timeout)、join(millis)或parkNanos() -
BLOCKED/WAITING/TIMED_WAITING → RUNNABLE:条件满足后自动或被唤醒——锁释放、收到
notify()、超时到达、或被LockSupport.unpark()唤醒
RUNNABLE → TERMINATED:生命周期终点
线程自然结束或异常终止时发生:
立即学习“Java免费学习笔记(深入)”;
-
run()方法正常执行完毕 -
run()中抛出未捕获的异常或错误(如NullPointerException、OutOfMemoryError) - 注意:
interrupt()不会直接导致 TERMINATED;它只是设置中断标志,是否退出由线程自身逻辑决定
关键细节不能忽略
状态转换不是“魔法”,背后有明确语义约束:
-
wait()必须在synchronized块内调用,否则抛IllegalMonitorStateException;调用后立刻释放锁 -
sleep()不释放任何锁,只让出 CPU,适用于“暂停一下”的场景 -
park()不依赖 synchronized,也不释放锁,但需要配对使用unpark(),且可多次unpark()累积,避免丢失唤醒 - 一旦进入 TERMINATED,状态不可逆;该 Thread 实例不能再启动


















