Java线程生命周期含六种不可逆状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED;NEW调用start()进入RUNNABLE,RUNNABLE为中转态,涵盖就绪与运行,BLOCKED因锁竞争、WAITING需显式唤醒、TIMED_WAITING可超时恢复,TERMINATED为终态不可复活。

Java 中线程的生命周期由 Thread.State 枚举定义,共六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。这些状态不可逆,一个线程在任意时刻只处于其中一种状态,转换完全由 JVM 控制,不依赖操作系统线程状态。
NEW → RUNNABLE:启动即不可回退
调用 new Thread() 后线程处于 NEW 状态;只有调用 start() 方法,才会进入 RUNNABLE。注意:
- start() 只能调用一次,重复调用抛出 IllegalThreadStateException
- NEW 状态线程尚未与操作系统线程绑定,也未分配任何执行资源
- 一旦进入 RUNNABLE,就永远无法回到 NEW
RUNNABLE 是核心中转状态
RUNNABLE 并非“正在 CPU 上运行”,而是指线程已启动、可被调度——包括“就绪(等待 CPU)”和“运行中(占用 CPU)”两种 OS 层面情形。JVM 不做细分,统一归为 RUNNABLE。几乎所有状态进出都经过它:
- 主动让出 CPU:调用 yield() 或时间片用尽 → 仍保持 RUNNABLE(只是暂时没被调度)
- 因锁竞争失败 → 进入 BLOCKED
- 调用 wait()、join()(无超时)→ 进入 WAITING
- 调用 sleep()、wait(long)、join(long) → 进入 TIMED_WAITING
- run() 正常结束或抛出未捕获异常 → 进入 TERMINATED
BLOCKED、WAITING、TIMED_WAITING 的唤醒机制不同
这三种状态都是“暂停执行”,但触发条件和恢复方式有本质区别:
立即学习“Java免费学习笔记(深入)”;
- BLOCKED:仅因争抢 synchronized 监视器锁失败而进入;一旦获得锁,自动回到 RUNNABLE
- WAITING:需外部显式唤醒——如其他线程调用 notify()/notifyAll()、被 join 的线程结束、或收到 interrupt()
- TIMED_WAITING:除上述唤醒方式外,还支持“时间到期自动恢复”,例如 sleep(2000) 两秒后自动回到 RUNNABLE
TERMINATED 是终态,不可复活
线程到达 TERMINATED 后,生命周期彻底结束:
- 唯一入口:run() 方法执行完毕,或抛出未捕获的 Exception / Error
- 无法再次 start(),也不能通过任何方式重新激活
- 此时调用 getState() 返回 TERMINATED,isAlive() 返回 false


















