java线程生命周期包含new、runnable、blocked、waiting、terminated五种状态:new为已创建未启动;runnable表示可运行或正执行;blocked因争抢synchronized锁而阻塞;waiting为无限期等待唤醒;terminated是run()结束或异常退出。

Java 线程的生命周期是指一个线程从创建到终止所经历的各个状态,它由 JVM 精确管理,并不完全等同于操作系统线程的状态。理解这些状态及其转换条件,是排查阻塞、死锁、资源竞争等问题的关键。
五个核心状态及其含义
Java 定义了 NEW、RUNNABLE、BLOCKED、WAITING、TERMINATED 五种线程状态(Thread.State 枚举),注意:RUNNABLE 并不表示“正在运行”,而是指“可运行或正在被 CPU 执行”——包括操作系统就绪队列中等待调度的线程。
-
NEW:线程对象已创建,但尚未调用
start() -
RUNNABLE:已调用
start(),处于 JVM 调度范围内(含 OS 就绪态 + 运行态) - BLOCKED:尝试进入 synchronized 同步块/方法,但锁被其他线程持有
-
WAITING:调用
Object.wait()、Thread.join()或LockSupport.park()后无限期等待唤醒 - TERMINATED:线程 run() 方法正常结束,或因未捕获异常而退出
状态转换不是任意跳转的
线程状态变化受明确规则约束,不能跨状态直接切换。例如:
- 从 BLOCKED 只能转为 RUNNABLE(获取到锁后),不会直接变成 WAITING
-
WAITING 状态必须由其他线程显式唤醒(
notify()、interrupt()、unpark())才能回到 RUNNABLE - RUNNABLE 线程可能因 I/O 阻塞、同步竞争、JVM 垃圾回收暂停等原因,在 OS 层面被挂起,但 JVM 仍将其标记为 RUNNABLE
如何观察真实线程状态
不能只看代码逻辑,要借助工具验证实际状态:
- 调用
thread.getState()获取当前 JVM 认为的状态(适合调试时简单检查) - 使用
jstack <pid></pid>查看全量线程快照,其中java.lang.Thread.State:行明确标出状态,还会附带堆栈和锁信息(如- waiting to lock) - JDK 自带 JConsole 或 VisualVM,可图形化查看线程状态分布与监控
- 注意:线程 dump 中的
parking to wait for对应 WAITING,waiting for monitor entry对应 BLOCKED
常见误区提醒
很多问题源于对状态的误解:
-
sleep()和wait()都让线程暂停,但前者保持锁、状态是 TIMED_WAITING;后者释放锁、状态是 WAITING -
Thread.stop()已废弃,强制中断会破坏锁一致性,应改用协作式中断(interrupt()+ 检查isInterrupted()) - 一个线程在
run()中执行耗时 IO(如Socket.read())时,JVM 仍显示 RUNNABLE,但它在 OS 层可能已陷入内核态等待——这不属于 Java 线程模型的“阻塞状态”,需结合系统工具分析
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











