Java线程状态由JVM自动管理,共六种:NEW→RUNNABLE(调用start())、RUNNABLE↔BLOCKED(争抢synchronized锁)、RUNNABLE→WAITING/TIMED_WAITING(调用wait()/sleep()等)、WAITING/TIMED_WAITING→RUNNABLE(被唤醒或超时)、RUNNABLE→TERMINATED(run()结束或异常)。

Java 线程的状态转换不是由程序员直接“设置”的,而是由 JVM 根据线程的执行行为和所调用的方法自动触发的。理解这些转换的关键,在于掌握 Thread.State 的六种状态及其触发条件。
NEW → RUNNABLE:启动线程
新建的线程处于 NEW 状态;调用 start() 后,JVM 为其分配资源并将其放入就绪队列,状态变为 RUNNABLE(注意:它不等同于“正在运行”,而是“可运行”——包括正在 CPU 执行,或等待 CPU 调度)。
- 不能对 NEW 状态的线程重复调用
start(),否则抛IllegalThreadStateException -
run()方法是普通方法,直接调用不会改变线程状态,也不会启动新线程
RUNNABLE ↔ BLOCKED:进入同步块时阻塞
当一个 RUNNABLE 线程尝试进入 synchronized 代码块或方法,但发现目标锁已被其他线程持有,它会立即转入 BLOCKED 状态,等待锁释放。
- 一旦持有锁的线程退出同步块、释放锁,JVM 会从等待该锁的 BLOCKED 线程中唤醒一个(不保证顺序),使其回到 RUNNABLE
- 注意:BLOCKED 只与 monitor 锁(synchronized)有关,和
Lock(如ReentrantLock)无关——后者导致的是 WAITING 或 TIMED_WAITING
RUNNABLE → WAITING / TIMED_WAITING:主动让出 CPU
线程在 RUNNABLE 状态下,调用某些等待方法后,会放弃 CPU 并进入无限期或限时等待:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Object.wait()→ WAITING(需先获得对象锁) -
Thread.join()、LockSupport.park()→ WAITING -
Object.wait(1000)、Thread.sleep(1000)、Thread.join(1000)、LockSupport.parkNanos(1000)→ TIMED_WAITING
这些状态的线程不会竞争 CPU,直到被显式唤醒(notify()/notifyAll())、中断(interrupt()),或超时自动返回 RUNNABLE。
WAITING/TIMED_WAITING → RUNNABLE:被唤醒或超时
等待中的线程恢复运行,有三种常见路径:
- 被
notify()或notifyAll()唤醒(仅对wait()有效),且重新获得对象锁后,进入 RUNNABLE - 被
interrupt()中断 → 抛出InterruptedException,然后进入 RUNNABLE - 超时自动结束(TIMED_WAITING)→ 直接回到 RUNNABLE
注意:sleep() 不释放锁,wait() 必须在 synchronized 中调用且会释放锁。
RUNNABLE → TERMINATED:自然结束或异常终止
线程执行完 run() 方法(正常返回),或因未捕获异常而终止,状态变为 TERMINATED。此后无法再启动(start() 会报错)。
- 线程死亡后,其堆栈、局部变量等资源由 JVM 回收,但 Thread 对象本身仍可访问(例如调用
getState()仍返回 TERMINATED) - 没有“暂停”或“恢复”状态 —— Java 不提供
stop()、resume()等已废弃的危险操作

















