Skip to content

线程的状态 转化过程

约 653 字大约 2 分钟

多线程与并发美团

2025-03-26

⭐ 题目日期:

美团 - 2024/12/23

📝 题解:

线程的状态转换过程涉及多个状态及其之间的转换条件,以下是详细的解析:

线程的主要状态:

  1. 新建(New):线程被创建但尚未启动。
  2. 就绪(Runnable):线程已启动,等待CPU分配时间片。
  3. 运行(Running):线程获得CPU,正在执行。
  4. 阻塞(Blocked/Waiting):线程因等待资源或事件暂停执行。
  5. 超时等待(Timed Waiting):线程在指定时间内等待。
  6. 终止(Terminated):线程执行完毕或异常退出。

状态转换流程及条件:

  1. 新建 → 就绪

    • 触发条件:调用线程的start()方法。
    • 说明:线程初始化后进入就绪队列,等待调度。
  2. 就绪 ↔ 运行

    • 就绪 → 运行:线程调度器选中该线程,分配CPU时间片。
    • 运行 → 就绪:时间片用完、主动调用yield()让出CPU,或被更高优先级线程抢占。
  3. 运行 → 阻塞/等待

    • 触发条件
      • 请求获取锁失败(进入Blocked状态)。
      • 调用Object.wait()Thread.join()LockSupport.park()(进入Waiting状态)。
      • 调用带有超时的方法如Thread.sleep(n)Object.wait(timeout)(进入Timed Waiting状态)。
    • 说明:线程释放CPU,暂停执行直至条件满足。
  4. 阻塞/等待 → 就绪

    • 触发条件
      • Blocked:获取到所需的锁。
      • Waiting:被notify()/notifyAll()唤醒,或Thread.join()的线程结束。
      • Timed Waiting:等待时间结束。
    • 说明:线程重新进入就绪队列,等待调度。
  5. 运行 → 终止

    • 触发条件
      • run()方法正常执行完毕。
      • 发生未捕获异常导致线程意外终止。
      • 调用stop()(不推荐,可能导致资源未释放)。
    • 说明:线程生命周期结束,无法再次启动。

关键注意事项:

  • 中断机制:调用interrupt()可中断处于阻塞/等待状态的线程,抛出InterruptedException,线程转为就绪状态。
  • 状态细分:在Java等语言中,阻塞可能细分为Blocked(锁竞争)、Waiting(无限期等待)和Timed Waiting(有限期等待)。
  • 不可逆转换:线程终止后不可回到其他状态,需重新创建线程实例。

状态转换图示例:

新建 --start()--> 就绪 <--调度--> 运行
运行 --等待资源--> 阻塞/等待
阻塞/等待 --条件满足--> 就绪
运行 --执行完毕/异常--> 终止

理解线程状态转换有助于优化多线程程序的性能与资源管理,例如合理避免死锁、减少不必要的阻塞等。