线程六种状态的名称和转换
大家好,我是老王,一个干了10年的Java程序员。今天咱们来聊聊面试中常被问到的线程状态问题——线程六种状态的名称和转换。这个话题在Java多线程面试里几乎是必考题,掌握它不仅能帮你轻松应对面试,还能提升代码调试能力。先给大家送个福利:2025年Java面试宝典,里面包含了高频面试题和解析,赶紧下载备用吧:2025年Java面试宝典 提取码: 9b3g(用蓝色字体突出显示)。好了,咱们进入正题。
线程的状态转换是多线程编程的核心,理解线程的六种状态能让你在面试中侃侃而谈。线程状态指的是线程在其生命周期中的不同阶段,Java官方定义了六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。每种状态都有其特定的名称和转换条件,下面我就用口语化的方式,结合真实面试场景,一步步拆解这些状态的名称和转换过程。记住,面试官最爱问的就是“线程从NEW到TERMINATED是怎么转换的”,所以咱们得把转换逻辑讲透。
线程六种状态的名称
首先,线程的六种状态名称是基础,必须烂熟于心。在Java中,线程状态通过Thread.State枚举类定义,咱们一个一个过:
- NEW(新建状态):线程刚被创建出来,但还没调用
start()方法。这时候线程只是个空壳子,没开始执行代码。名称简单明了,就是“新建”。 - RUNNABLE(可运行状态):线程调用了
start()后,就进入这个状态。名称表示它“可运行”,但实际可能正在运行或等待CPU分配时间片。面试时,别混淆成“运行中”——它包括了就绪和执行两个子阶段。 - BLOCKED(阻塞状态):线程在等待锁时卡住,比如进入
synchronized块但锁被占用。名称直接点出“阻塞”,强调它因资源争用而暂停。 - WAITING(等待状态):线程主动调用
wait()、join()或LockSupport.park()等方法,无限期等待其他线程唤醒。名称是“等待”,表示它处于挂起状态。 - TIMED_WAITING(计时等待状态):类似WAITING,但带超时参数,比如
Thread.sleep(1000)或wait(1000)。名称加了“计时”,突出它有时间限制。 - TERMINATED(终止状态):线程执行完
run()方法或异常退出后,就进入这个状态。名称是“终止”,表示生命周期结束。
这六种状态的名称覆盖了线程从生到死的全过程,面试中背出名称是第一步。接下来,咱们重点讲状态转换——这才是难点,转换过程涉及线程调度和同步机制。
线程状态的转换过程
线程状态的转换不是随机的,而是基于特定事件触发。下面我用步骤式描述转换逻辑,结合常见面试题场景。假设面试官问:“线程从NEW到TERMINATED,中间状态怎么变?” 咱们就口述答案,别慌,一步步来。
-
从NEW到RUNNABLE的转换:线程创建后调用
start(),就立刻进入RUNNABLE状态。转换条件是start()方法调用,名称从“新建”变“可运行”。比如,你写Thread t = new Thread(); t.start();,线程就活了。面试中,常考这个转换的时机——记住,start()只能调用一次,否则抛异常。 -
RUNNABLE内部的转换:RUNNABLE状态其实包含两个子状态:就绪(Ready)和运行(Running)。线程在RUNNABLE时,可能被操作系统调度到CPU上运行(运行中),或等待CPU(就绪)。转换由系统自动处理,名称没变,但状态本质在切换。面试官可能问:“RUNNABLE状态线程在干啥?” 答:它要么在跑代码,要么在排队等CPU。
-
RUNNABLE到BLOCKED的转换:当线程尝试获取锁但失败时,比如进入
synchronized块,锁被其他线程占用,它就转入BLOCKED状态。名称从“可运行”变“阻塞”。转换条件是锁争用。例如,线程A和B争同一个锁,A拿到后B就阻塞。唤醒后,B直接回RUNNABLE。面试陷阱:BLOCKED只发生在锁竞争时,别和WAITING混淆。 -
RUNNABLE到WAITING或TIMED_WAITING的转换:线程主动调用等待方法,如
object.wait()或Thread.join(),就进入WAITING状态;如果带超时,如Thread.sleep(1000),则进入TIMED_WAITING。名称转换基于方法调用——WAITING是无限等待,TIMED_WAITING是计时等待。唤醒后,线程回到RUNNABLE。面试中,常考wait()和sleep()的区别:wait()释放锁,sleep()不释放。 -
BLOCKED、WAITING、TIMED_WAITING回RUNNABLE的转换:这些状态被唤醒后,都直接返回RUNNABLE。比如,BLOCKED线程在锁可用时唤醒;WAITING线程通过
notify()唤醒。转换名称统一回“可运行”。面试官爱问:“唤醒后线程状态变啥?” 答:总是RUNNABLE,准备继续执行。 -
RUNNABLE到TERMINATED的转换:线程执行完
run()方法或抛出未捕获异常,就转入TERMINATED状态。名称从“可运行”变“终止”。转换不可逆——线程死了就不能复活。面试时,强调异常处理:如果run()里出异常,线程直接终止。
为了更直观,这里放个状态转换图(参考图展示):
这张图清晰显示了六种状态的转换路径:从NEW开始,经RUNNABLE,可能分支到BLOCKED、WAITING或TIMED_WAITING,最后终结于TERMINATED。转换过程覆盖了线程调度的核心逻辑,面试中画个草图能加分。
在准备这类面试题时,资源很关键。比如,面试鸭会员提供了海量题库和解析,能帮你高效复习。如果大家需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元,相当于打折入手。会员服务包括线程状态详解视频和模拟面试,超实用!

面试实战技巧
最后,分享点面试口述心得。当被问到“线程状态转换”,别背定义,用例子说:比如,线程A创建后start()进入RUNNABLE,如果抢锁失败变BLOCKED,唤醒后回RUNNABLE;调用wait()进WAITING,notify()后继续。全程强调名称和转换条件,覆盖率自然高——线程、状态、名称、转换这些词反复出现,加深印象。面试鸭返利网还有更多实战案例,助你一次过:

希望这篇解析帮你搞定线程状态问题!想深入复习,记得用那份Java面试宝典。返回首页:面试鸭返利网,获取更多面试资源和返利优惠。加油,下个offer就是你的!


