线程有几种状态和转换:程序员面试必知的底层逻辑
作为一个常年混迹技术面试的老手,线程状态转换几乎是必考题。今天咱们就抛开教科书,用最直白的方式聊聊线程到底有几种状态,以及它们之间怎么转换的,帮你面试时对答如流!
一、线程的六种核心状态
Java线程的生命周期由java.lang.Thread.State枚举明确定义,共6种状态:
-
NEW(新建):- 你刚
new Thread(),但还没调start()。 - 就像新员工入职签了合同,但还没正式上岗干活。
- 你刚
-
RUNNABLE(可运行):- 调用了
start(),线程就绪。 - 注意:它包含等待CPU分配时间片和正在运行两种情况。操作系统调度资源紧张时,即使你调了
start(),线程也随时可能等待CPU。
- 调用了
-
BLOCKED(阻塞):- 线程想获取一个被其他线程占着的对象锁(synchronized),就会卡在这里。
- 典型场景:线程A占着锁,线程B也想拿,B就进入Blocked状态,直到A释放。
-
WAITING(无限等待):- 线程主动调用
wait()、join()或park(),进入此状态。 - 它不会自动醒,必须等别人来叫醒(
notify()/notifyAll()或目标线程结束/unpark())。 - 面试官最爱问
wait()和sleep()区别:wait()会释放锁,sleep()抱着锁睡觉。
- 线程主动调用
-
TIMED_WAITING(限时等待):- 带超时时间的等待。调用
Thread.sleep(long)、wait(long)、join(long)、parkNanos()等。 - 时间到了或被人叫醒,就尝试回到
RUNNABLE。
- 带超时时间的等待。调用
-
TERMINATED(终止):- 线程执行完
run()方法,或者异常终止。 - 到此为止,线程生命结束,无法重启。
- 线程执行完
二、线程状态转换流程图(核心!)

(这张图清晰展示了状态间的转换条件,面试时能描述清楚就赢了!)
三、状态转换的触发条件详解
- NEW -> RUNNABLE:
thread.start()。 - RUNNABLE -> BLOCKED:抢不到synchronized锁。
- BLOCKED -> RUNNABLE:持有锁的线程释放了锁,系统调度到它。
- RUNNABLE -> WAITING:
- 调用
object.wait()(前提是持有锁!) - 调用
thread.join()(等待目标线程结束) - 调用
LockSupport.park()
- 调用
- WAITING -> RUNNABLE:
object.notify()/notifyAll()唤醒- 被
join()的目标线程结束 LockSupport.unpark(thread)
- RUNNABLE -> TIMED_WAITING:
Thread.sleep(long)object.wait(long)thread.join(long)LockSupport.parkNanos()/parkUntil()
- TIMED_WAITING -> RUNNABLE:
- 超时时间到
- 被唤醒(
notify/unpark等)
- RUNNABLE -> TERMINATED:
run()方法执行完毕或抛出未捕获异常。
四、面试避坑指南
- RUNNABLE ≠ 正在运行:面试官问“线程调用start()后是什么状态?”答“RUNNABLE”,但一定要补充说明它可能在等CPU。
- BLOCKED vs WAITING:关键区别在于是否主动释放资源。BLOCKED是抢不到锁被动卡住(不释放已占资源),WAITING是主动放弃锁去等待。
- 锁与等待:调用
wait()前必须持有锁,调用后释放锁;被唤醒后需要重新竞争锁才能继续执行。 sleep()不释放锁:这是和wait()的核心区别之一。
五、实战应用场景
- 线程同步:理解
BLOCKED、WAITING是解决synchronized、ReentrantLock等同步机制的关键。 - 线程协作:生产者消费者模型(
wait/notify)、任务编排(join)依赖WAITING/TIMED_WAITING。 - 性能调优:线程长期处于
BLOCKED或WAITING可能是瓶颈点(锁竞争激烈、资源不足)。 - 死锁定位:分析线程Dump时,看线程卡在哪个状态(BLOCKED on锁、WAITING on条件)是诊断关键。
📌 面试加分项:想系统掌握Java并发?推荐这份《2025 Java面试核心宝典》:链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g 。覆盖线程、锁、JUC、JVM等高频考点。
六、总结与资源
搞懂线程的6种状态及其转换条件,是深入理解Java并发编程的基石。面试时能清晰画出状态图并解释转换条件,绝对让面试官眼前一亮!

最后提一嘴:如果你准备购买面试鸭会员,可以通过 面试鸭返利网 联系我,走专属返利通道能立减25元!省下的钱买杯咖啡刷题更香~ 备战面试,精打细算才是硬道理!


