子线程的状态转换
大家好,今天咱们来聊聊面试中高频出现的考点——子线程的状态转换。理解线程的生命周期状态,是搞定多线程编程的基础,面试官特爱问这个!下面我就用大白话给大家捋一捋。

2025年Java面试宝典抢先看!
👉 点此获取 👈
提取码:9b3g (网盘持续更新,建议保存)
一、线程的"出生":NEW 状态
当你用 new Thread() 创建了一个子线程对象,但还没调用 start() 方法时,它就处在 NEW 状态。这时候的子线程就是个"婴儿",有了生命体征但还没开始活动。这个状态转换的起点很简单,但却是后续所有状态转换的基础。
二、就绪待命:RUNNABLE 状态
一旦调用 start(),子线程就进入 RUNNABLE(可运行)状态。注意了!这并不代表它正在CPU上跑,而是说它具备了运行资格,在等待操作系统分配CPU时间片。你可以把它想象成赛场边的运动员,裁判(CPU)喊谁,谁就上场跑。这个状态转换是子线程开始工作的关键一步!
三、遇到阻塞:BLOCKED 状态
当子线程试图获取一个被其他线程占用的同步锁(synchronized)时,就会发生状态转换,进入 BLOCKED(阻塞)状态。比如线程A拿着锁,线程B也想拿,这时候B就只能干等着,直到A释放锁,B才能从阻塞状态转换回可运行状态。这是多线程同步中很常见的状态转换场景。
四、主动暂停:WAITING / TIMED_WAITING 状态
- WAITING:当线程调用了
Object.wait()、Thread.join()或LockSupport.park()等方法,且不设超时时间时,它会无限期等待,直到被其他线程唤醒。这种状态转换是线程主动让出CPU。 - TIMED_WAITING:和WAITING类似,但加了时间限制(如
Thread.sleep(1000)、Object.wait(500))。时间一到或收到通知,子线程会自动触发状态转换回RUNNABLE。这个状态转换在定时任务、重试机制里很常用。

五、生命终结:TERMINATED 状态
当子线程的 run() 方法执行完毕,或者运行过程中抛出了未捕获的异常导致线程意外终止,它就进入了 TERMINATED(终止)状态。这个状态转换意味着线程生命周期结束,资源会被回收。记住,一旦终止就不能再通过 start() 重启了!
总结关键点
整个子线程的生命周期,其实就是围绕这几个核心状态(NEW, RUNNABLE, BLOCKED, WAITING/TIMED_WAITING, TERMINATED)的转换过程。面试时被问到"线程有哪些状态?",把这几个名字答出来是基本要求,如果能清晰描述它们之间转换的条件和场景(比如什么操作会引起哪种状态转换),绝对能加分!
最后插个小福利 👇
如果你正在准备面试,需要系统刷题或查看高频考点解析,强烈推荐使用面试鸭会员!海量真题+详细题解助你快速通关。
✅ 悄悄告诉你:通过 面试鸭返利网 (mianshiyafanli.com) 购买会员,还能额外返利25元!直接省下一顿饭钱,赶紧试试吧 ➡️



