Java线程状态单向演进不可逆:NEW→RUNNABLE→(BLOCKED/WAITING/TIMED_WAITING)→TERMINATED,各状态转换严格遵循JVM与OS调度机制,无任何回退路径。

Java线程状态一旦离开某个阶段,就再也不会回到该状态——这种单向演进特性是理解线程生命周期的核心。它不是设计上的限制,而是由JVM底层机制和操作系统调度模型共同决定的不可逆事实。
NEW → RUNNABLE 是唯一可触发的“启动门”
NEW状态仅存在于线程对象被构造完成、但尚未调用start()的瞬间。此时线程未绑定任何OS线程资源,也未分配栈空间或程序计数器。
- 调用start()后,JVM向操作系统申请内核线程,状态立即变为RUNNABLE
- start()只能调用一次;重复调用抛出IllegalThreadStateException,状态不会回退到NEW
- 即使start()后线程立刻因异常退出,也不会回到NEW,而是直接走向TERMINATED
RUNNABLE 是“运行中”与“就绪中”的统一抽象
RUNNABLE不表示“正在CPU上执行”,而是指线程具备执行资格:要么正被调度运行,要么在就绪队列中等待CPU时间片。这个状态本身没有出口指向NEW或TERMINATED,但它是所有活跃状态的中枢入口和中转站。
- 从RUNNABLE出发,可能因锁竞争进入BLOCKED
- 可能因wait()、join()、park()进入WAITING
- 可能因sleep()、join(long)、parkNanos()进入TIMED_WAITING
- run()方法正常返回或抛出未捕获异常时,状态自动变为TERMINATED
BLOCKED / WAITING / TIMED_WAITING 均不可回退至NEW或RUNNABLE之前的任意状态
这些等待态都是线程主动让出CPU后的中间停留点,它们的退出条件严格受限于外部协作行为(如notify、中断、超时),而非线程自身控制流倒退。
- BLOCKED只会在获取到目标synchronized锁后,回到RUNNABLE;不可能变回NEW,也不接受start()重试
- WAITING必须等待其他线程显式唤醒(notify/wait、join完成、unpark)才能恢复;无法通过修改变量或重置逻辑“撤销等待”
- TIMED_WAITING在超时或中断后回到RUNNABLE;时间一过即不可逆,不存在“暂停计时”或“延长等待”的API
TERMINATED 是真正的终点,且不可重启
当线程的run()方法执行完毕,或因未捕获异常而终止,JVM释放其全部资源(栈、本地变量、监控器所有权等),状态永久定格为TERMINATED。
- 不能对TERMINATED线程再次调用start(),会抛出IllegalThreadStateException
- 不能通过反射或其他手段将其状态改回RUNNABLE
- Thread对象仍可被引用,但已失去线程语义,变成一个普通Java对象
变量状态的不可逆性,本质是线程作为轻量级进程的资源生命周期管理要求:创建、调度、等待、销毁必须线性推进,避免状态歧义与资源泄漏。理解这一点,才能写出可预测的并发代码,也才能准确解读jstack输出中的线程快照。

















