Java线程状态转换图
作为程序员,面试时被问"说说Java线程状态转换"的概率堪比被问HashMap原理。今天咱们就掰开揉碎讲透这张状态转换图,让你在面试中游刃有余!
一、线程的六种人生阶段
Java线程从出生到消亡共有6种状态:
- NEW:刚
new Thread()但没调start(),就像领了工牌还没工位的萌新 - RUNNABLE:调用
start()后的状态(注意:包含就绪和运行中!) - BLOCKED:抢不到synchronized锁时的憋屈状态
- WAITING:调用
wait()/join()后的望眼欲穿状态 - TIMED_WAITING:带超时的等待,比如
Thread.sleep(1000) - TERMINATED:线程run()执行完毕的退休状态
📎 2025最新Java面试宝典:
点击下载(密码:9b3g)
二、状态转换核心路径
graph LR
A[NEW] -->|start()| B(RUNNABLE)
B -->|获取锁失败| C[BLOCKED]
C -->|获取到锁| B
B -->|wait()| D[WAITING]
D -->|notify()| B
B -->|sleep()| E[TIMED_WAITING]
E -->|时间到| B
B -->|run()结束| F[TERMINATED]

三、面试致命三连问破解
-
BLOCKED和WAITING有什么区别?
- BLOCKED是等锁(主动争抢)
- WAITING是等条件(被动唤醒)
-
sleep()和wait()的差别?
// sleep()不释放锁,wait()会释放锁! synchronized(lock){ Thread.sleep(1000); // 抱着锁睡觉 lock.wait(); // 把锁交出去等人通知 } -
RUNNABLE包含哪些状态?
这是最容易踩的坑!RUNNABLE实际包含:- 就绪:等待CPU分配时间片
- 运行中:正在执行任务
查看状态用
thread.getState(),别肉眼瞎猜!
四、高频翻车场景
当面试官问:"线程调用yield()会进入什么状态?"
正确答案:仍在RUNNABLE状态!yield()只是让出CPU,随时可能被再次调度
若被问"notify()后线程立刻执行吗?"
雷区回答:× 立刻执行
正确姿势:只是从WAITING进入BLOCKED状态,还得重新抢锁!

五、避坑指南
- TIMED_WAITING≠定时器:比如
Thread.sleep(1000)可能睡>1秒(看OS脸色) - TERMINATED不可逆:线程结束就像泼出去的水,调用start()直接抛IllegalThreadStateException
- BLOCKED专为synchronized:用Lock接口的线程会进WAITING
💡 想系统性刷透Java并发题?悄悄告诉你:通过面试鸭返利网购买会员可返现25元,题库更新快还带大厂解析!
理解透这张线程状态转换图,面试时被问到并发问题起码能拿下60%分数。建议把转换图存手机里,上厕所时多看两眼,比背八股文管用多了!



