面试鸭返利网

线程有几种状态和转换

线程状态转换是Java面试必考知识点,掌握6种核心状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)及其转换条件是面试加分项。本文详解线程生命周期,通过流程图直观展示状态转换逻辑,重点解析wait/sleep区别、锁竞争机制等高频考点。想系统学习Java并发?获取《2025Java面试宝典》提升竞争力,同时通过面试鸭返利网可享会员优惠。备战金三银四,从深入理解线程状态开始!

线程有几种状态和转换:程序员面试必知的底层逻辑

作为一个常年混迹技术面试的老手,线程状态转换几乎是必考题。今天咱们就抛开教科书,用最直白的方式聊聊线程到底有几种状态,以及它们之间怎么转换的,帮你面试时对答如流!

一、线程的六种核心状态

Java线程的生命周期由java.lang.Thread.State枚举明确定义,共6种状态:

  1. NEW (新建)

    • 你刚new Thread(),但还没调start()
    • 就像新员工入职签了合同,但还没正式上岗干活。
  2. RUNNABLE (可运行)

    • 调用了start(),线程就绪。
    • 注意:它包含等待CPU分配时间片正在运行两种情况。操作系统调度资源紧张时,即使你调了start(),线程也随时可能等待CPU。
  3. BLOCKED (阻塞)

    • 线程想获取一个被其他线程占着的对象锁(synchronized),就会卡在这里。
    • 典型场景:线程A占着锁,线程B也想拿,B就进入Blocked状态,直到A释放。
  4. WAITING (无限等待)

    • 线程主动调用wait()join()park(),进入此状态。
    • 不会自动醒,必须等别人来叫醒(notify()/notifyAll()或目标线程结束/unpark())。
    • 面试官最爱问wait()sleep()区别:wait()会释放锁,sleep()抱着锁睡觉。
  5. TIMED_WAITING (限时等待)

    • 带超时时间的等待。调用Thread.sleep(long)wait(long)join(long)parkNanos()等。
    • 时间到了或被人叫醒,就尝试回到RUNNABLE
  6. TERMINATED (终止)

    • 线程执行完run()方法,或者异常终止。
    • 到此为止,线程生命结束,无法重启。

二、线程状态转换流程图(核心!)

线程状态转换图
(这张图清晰展示了状态间的转换条件,面试时能描述清楚就赢了!)

三、状态转换的触发条件详解

  1. NEW -> RUNNABLEthread.start()
  2. RUNNABLE -> BLOCKED:抢不到synchronized锁
  3. BLOCKED -> RUNNABLE:持有锁的线程释放了锁,系统调度到它。
  4. RUNNABLE -> WAITING
    • 调用object.wait()(前提是持有锁!)
    • 调用thread.join()(等待目标线程结束)
    • 调用LockSupport.park()
  5. WAITING -> RUNNABLE
    • object.notify()/notifyAll()唤醒
    • join()的目标线程结束
    • LockSupport.unpark(thread)
  6. RUNNABLE -> TIMED_WAITING
    • Thread.sleep(long)
    • object.wait(long)
    • thread.join(long)
    • LockSupport.parkNanos()/parkUntil()
  7. TIMED_WAITING -> RUNNABLE
    • 超时时间到
    • 被唤醒(notify/unpark等)
  8. RUNNABLE -> TERMINATEDrun()方法执行完毕或抛出未捕获异常。

四、面试避坑指南

  • RUNNABLE ≠ 正在运行:面试官问“线程调用start()后是什么状态?”答“RUNNABLE”,但一定要补充说明它可能在等CPU。
  • BLOCKED vs WAITING:关键区别在于是否主动释放资源。BLOCKED是抢不到锁被动卡住(不释放已占资源),WAITING是主动放弃锁去等待。
  • 锁与等待:调用wait()必须持有锁,调用后释放锁;被唤醒后需要重新竞争锁才能继续执行。
  • sleep()不释放锁:这是和wait()的核心区别之一。

五、实战应用场景

  • 线程同步:理解BLOCKEDWAITING是解决synchronizedReentrantLock等同步机制的关键。
  • 线程协作:生产者消费者模型(wait/notify)、任务编排(join)依赖WAITING/TIMED_WAITING
  • 性能调优:线程长期处于BLOCKEDWAITING可能是瓶颈点(锁竞争激烈、资源不足)。
  • 死锁定位:分析线程Dump时,看线程卡在哪个状态(BLOCKED on锁、WAITING on条件)是诊断关键。

📌 面试加分项:想系统掌握Java并发?推荐这份《2025 Java面试核心宝典》:链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g 。覆盖线程、锁、JUC、JVM等高频考点。

六、总结与资源

搞懂线程的6种状态及其转换条件,是深入理解Java并发编程的基石。面试时能清晰画出状态图并解释转换条件,绝对让面试官眼前一亮!

面试鸭返利网
最后提一嘴:如果你准备购买面试鸭会员,可以通过 面试鸭返利网 联系我,走专属返利通道能立减25元!省下的钱买杯咖啡刷题更香~ 备战面试,精打细算才是硬道理!

>> 返回首页获取更多面试干货

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

立即加入面试鸭会员 →