Java线程生命周期主线为新建(NEW)、RUNNABLE(统合就绪与运行)、TERMINATED(死亡);官方Thread.State含6种状态,其中RUNNABLE涵盖可调度但未必正在执行的活跃态,BLOCKED等属其暂停分支。

Java 线程生命周期中,“新建、就绪、运行、死亡”这四个状态是理解线程行为最基础的主线。它们对应线程从诞生到终结的关键阶段,但要注意:官方 Thread.State 枚举实际定义了 6 种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED),其中“就绪”和“运行”在 Java 中被统一归为 RUNNABLE 状态——这是最容易产生误解的地方。
新建(NEW):对象已造好,还没“上岗”
调用 new Thread(...) 后,线程对象在堆内存中诞生,JVM 已分配资源、初始化字段,但它尚未被线程调度器管理,也不具备执行能力。此时调用 getState() 返回 NEW。它就像填完入职表但还没打卡的员工——有身份,没工号,不排班。
- 不能调用
start()两次,否则抛IllegalThreadStateException - 直接调用
run()不会启动新线程,只是普通方法调用,仍在当前线程里执行
就绪与运行统一为 RUNNABLE:能跑,不等于正在跑
调用 start() 后,线程进入 RUNNABLE 状态。Java 不区分“就绪”和“运行”,因为从 JVM 视角看:只要线程已启动、未阻塞、未等待、未终止,它就处于可被 CPU 调度的就绪队列中——是否真在 CPU 上执行,由操作系统决定,JVM 不感知也不暴露“Running”这个独立状态。
- 处于 RUNNABLE 的线程可能正在 CPU 上执行(running),也可能在就绪队列里排队(ready)
- 常见误区:以为
getState() == RUNNABLE就代表“正在跑”。其实它只说明线程“活著且没卡住”,不反映瞬时 CPU 占用 - I/O、锁竞争、sleep 等操作一旦发生,就会立刻离开 RUNNABLE,进入 BLOCKED/WAITING/TIMED_WAITING
死亡(TERMINATED):任务结束,不可复活
线程的 run() 方法正常执行完毕,或因未捕获异常而退出,线程即进入 TERMINATED 状态。此时线程资源已被 JVM 回收,getState() 返回 TERMINATED,且永远无法再次调用 start()——就像离职员工不能用同一工号返岗。
立即学习“Java免费学习笔记(深入)”;
- 即使线程对象还被引用(如变量未置 null),状态也不会变回 RUNNABLE
-
interrupt()不会直接让线程死亡,只是设置中断标志;是否终止取决于run()内部如何响应 - 强制停止(如已废弃的
stop())不推荐,易导致数据不一致
本质上,新建是起点,RUNNABLE 是活跃态的统称,TERMINATED 是终点。中间的 BLOCKED/WAITING 等属于 RUNNABLE 的“暂停分支”,不是独立生命周期阶段,而是 RUNNABLE 的临时让出。抓住这个主干,就不会被“就绪/运行”二分说法带偏。


















