外观
线程的状态 转化过程
⭐ 题目日期:
美团 - 2024/12/23
📝 题解:
线程的状态转换过程涉及多个状态及其之间的转换条件,以下是详细的解析:
线程的主要状态:
- 新建(New):线程被创建但尚未启动。
- 就绪(Runnable):线程已启动,等待CPU分配时间片。
- 运行(Running):线程获得CPU,正在执行。
- 阻塞(Blocked/Waiting):线程因等待资源或事件暂停执行。
- 超时等待(Timed Waiting):线程在指定时间内等待。
- 终止(Terminated):线程执行完毕或异常退出。
状态转换流程及条件:
新建 → 就绪
- 触发条件:调用线程的
start()
方法。 - 说明:线程初始化后进入就绪队列,等待调度。
- 触发条件:调用线程的
就绪 ↔ 运行
- 就绪 → 运行:线程调度器选中该线程,分配CPU时间片。
- 运行 → 就绪:时间片用完、主动调用
yield()
让出CPU,或被更高优先级线程抢占。
运行 → 阻塞/等待
- 触发条件:
- 请求获取锁失败(进入Blocked状态)。
- 调用
Object.wait()
、Thread.join()
或LockSupport.park()
(进入Waiting状态)。 - 调用带有超时的方法如
Thread.sleep(n)
、Object.wait(timeout)
(进入Timed Waiting状态)。
- 说明:线程释放CPU,暂停执行直至条件满足。
- 触发条件:
阻塞/等待 → 就绪
- 触发条件:
- Blocked:获取到所需的锁。
- Waiting:被
notify()
/notifyAll()
唤醒,或Thread.join()
的线程结束。 - Timed Waiting:等待时间结束。
- 说明:线程重新进入就绪队列,等待调度。
- 触发条件:
运行 → 终止
- 触发条件:
run()
方法正常执行完毕。- 发生未捕获异常导致线程意外终止。
- 调用
stop()
(不推荐,可能导致资源未释放)。
- 说明:线程生命周期结束,无法再次启动。
- 触发条件:
关键注意事项:
- 中断机制:调用
interrupt()
可中断处于阻塞/等待状态的线程,抛出InterruptedException
,线程转为就绪状态。 - 状态细分:在Java等语言中,阻塞可能细分为Blocked(锁竞争)、Waiting(无限期等待)和Timed Waiting(有限期等待)。
- 不可逆转换:线程终止后不可回到其他状态,需重新创建线程实例。
状态转换图示例:
新建 --start()--> 就绪 <--调度--> 运行
运行 --等待资源--> 阻塞/等待
阻塞/等待 --条件满足--> 就绪
运行 --执行完毕/异常--> 终止
理解线程状态转换有助于优化多线程程序的性能与资源管理,例如合理避免死锁、减少不必要的阻塞等。