线程状态转换图:Java面试必考核心解析
2025年Java面试宝典重磅分享: 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g (建议保存备用)
一、为什么线程状态转换图是面试重灾区?
每次面试问到多线程,面试官十有八九会甩出这个问题:“画一下Java线程的状态转换图,并解释状态切换条件”。这玩意儿就像通关文牒,答不上来基本就凉了一半。理解线程状态转换图不仅能应付面试,更是排查死锁、线程阻塞等线上问题的基本功。
(Java线程生命周期核心示意图)
二、6大状态与转换条件全拆解
-
NEW(新建)
new Thread()瞬间诞生,但还没调用start(),此时就是个"壳线程"。 -
RUNNABLE(可运行)
调用start()后进入此状态。注意:包含就绪(Ready)和运行中(Running)!是否真正占用CPU取决于操作系统调度。 -
BLOCKED(阻塞)
关键场景: 抢synchronized锁失败!比如线程A占着锁,线程B来抢就会卡在这里,直到锁释放。 -
WAITING(无限等待)
必须被其他线程显式唤醒!常见触发方式:object.wait()(需先获得锁)thread.join()LockSupport.park()
-
TIMED_WAITING(限时等待)
自带闹钟的等待,常见方法:Thread.sleep(1000); object.wait(500); thread.join(200); -
TERMINATED(终止)
run()方法执行完毕或抛出未捕获异常,线程彻底凉凉。
三、高频面试题实战拆招
面试官: “BLOCKED和WAITING有什么区别?”
你答:
“BLOCKED是等锁,是JVM层面竞争
synchronized失败导致的被动卡住;WAITING是主动放弃CPU,需要别人唤醒。比如wait()会释放锁,而抢锁失败(BLOCKED)的线程根本没拿到过锁。”
面试官: “调用Thread.sleep()和Object.wait()后线程状态分别是什么?”
你答:
“sleep()会让线程进入TIMED_WAITING,但不会释放锁;wait()必须用在同步块里,调用后线程进入WAITING或TIMED_WAITING(带超时),同时会释放锁!”
四、避坑指南:状态转换的魔鬼细节
-
从RUNNABLE到BLOCKED只有一条路:抢
synchronized锁失败!
ReentrantLock等显式锁的等待是WAITING/TIMED_WAITING! -
唤醒机制陷阱:
notify()随机唤醒一个WAITING线程notifyAll()唤醒所有WAITING线程
被唤醒的线程会从WAITING切回BLOCKED状态(重新竞争锁)
-
中断响应:
在WAITING/TIMED_WAITING状态的线程收到interrupt()会抛InterruptedException,并切换到RUNNABLE
五、如何用工具验证线程状态?
-
jstack命令:
jstack <pid>查看线程堆栈,状态显示在括号里:"Thread-0" #12 prio=5 os_prio=0 tid=0x00007fb... nid=0x6d03 waiting on condition [0x00007fb...] java.lang.Thread.State: TIMED_WAITING (sleeping) # 关键状态标识! -
Arthas的thread命令:
实时监控线程状态变化,比jstack更动态:[arthas@1234]$ thread Threads Total: 200, RUNNABLE: 10, BLOCKED: 2, WAITING: 30 ...

六、面试加分的实战经验
场景: 线上服务卡死,怀疑线程死锁
排查步骤:
top -Hp <pid>找高CPU/卡死线程IDjstack <pid> | grep -A 20 <nid>查看线程堆栈- 重点看BLOCKED状态线程:
"Thread-1" BLOCKED (on object monitor) waiting to lock 0x000000076bf0f5e0 # 想抢的锁 at com.Example.service(Example.java:20) "Thread-2" BLOCKED (on object monitor) holding lock 0x000000076bf0f5e0 # 正持有的锁 at com.Example.service(Example.java:30) - 对比发现Thread-1等Thread-2的锁,Thread-2等Thread-1的锁 → 经典死锁!
🚀 高效备战提示: 如果你需要系统刷题或开通面试鸭会员,通过 面试鸭返利网 下单可额外返利25元!覆盖主流大厂真题+解析,点击直达👉 mianshiyafanli.com
七、终极面试防坑Checklist
- 画图时明确标注6个状态,漏掉TIMED_WAITING是常见扣分点!
- 说清楚
wait()会释放锁,sleep()不释放 - 区分
synchronized导致的BLOCKED和Lock的WAITING - 强调RUNNABLE包含操作系统层面的就绪/运行
- 知道
jstack和Arthas的验证方式
记住:面试官考线程状态转换图本质是考察你对线程调度机制的理解深度。死记硬背不如写个Demo验证状态变化,印象更深刻!


