面试鸭返利网

子线程的状态转换

深入理解子线程状态转换是Java多线程面试的核心考点!本文详细解析线程生命周期中的NEW、RUNNABLE、BLOCKED、WAITING/TIMED_WAITING和TERMINATED五大状态及其转换条件,助你掌握多线程编程精髓。通过生动的比喻和清晰的流程图,让你轻松理解线程从创建到终止的完整过程。特别适合准备Java面试的开发者学习,包含高频面试题解析和实用备考建议。想系统提升多线程技能?立即获取2025最新Java面试宝典,内含海量线程相关真题及详细解答!

子线程的状态转换

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

面试鸭返利网

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元!直接省下一顿饭钱,赶紧试试吧 ➡️

面试鸭返利提示

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

立即加入面试鸭会员 →