当前位置: 首页 > news >正文

Java线程6种状态的详细说明、状态转换关系(UML展示)

以下是Java线程状态的详细说明、状态转换关系的UML图描述以及表格整理:


一、Java线程状态

Java线程的生命周期包含以下6种状态:

  1. NEW:线程已创建但未启动(未调用start()方法)。
  2. RUNNABLE:线程可运行(可能正在执行或等待CPU调度)。
  3. BLOCKED:线程因等待获取锁(如synchronized)而阻塞。
  4. WAITING:线程主动进入无限期等待(需其他线程显式唤醒)。
  5. TIMED_WAITING:线程进入有限期等待(自动超时后恢复)。
  6. TERMINATED:线程执行完毕或异常终止。

二、状态转换关系(UML图描述)

以下是线程状态转换的UML状态图结构(用文字描述):

+-------------------+
|       NEW         |
|                   |
+-------+-----------+
        | start()   |
        v           |
+-------v-----------+
|  RUNNABLE         | ← [锁释放]
|                   | ← [超时/中断]
+-------+-----------+ ← [唤醒]
        |           |
        |           +→ [竞争锁失败] → +----------------+
        |                       → |    BLOCKED      |
        |                       → +----------------+
        |                       ← [锁释放]
        |           +→ [调用wait()等] → +----------------+
        |                       → |   WAITING      |
        |                       → +----------------+
        |                       ← [notify()/interrupt()]
        |           +→ [调用sleep()等] → +----------------+
        |                       → | TIMED_WAITING |
        |                       → +----------------+
        |                       ← [超时/中断/唤醒]
        |           |
        |           +→ [run()执行完毕] → +----------------+
        +--------------------------→ | TERMINATED    |
                                    +----------------+
转换条件说明
  1. NEW → RUNNABLE:调用thread.start()
  2. RUNNABLE → BLOCKED:尝试获取被占用的synchronized锁。
  3. RUNNABLE → WAITING:调用Object.wait()Thread.join()LockSupport.park()
  4. RUNNABLE → TIMED_WAITING:调用Thread.sleep()Thread.join(long)Object.wait(long)
  5. RUNNABLE → TERMINATEDrun()方法执行完毕或抛出未捕获异常。
  6. BLOCKED → RUNNABLE:锁被释放。
  7. WAITING → RUNNABLE:被notify()unpark()interrupt()唤醒。
  8. TIMED_WAITING → RUNNABLE:超时、被notify()unpark()interrupt()唤醒。
  9. TERMINATED:终态,无法转换。

三、状态对比表格

状态描述转换条件典型场景
NEW线程已创建但未启动。start()RUNNABLE线程对象初始化后未启动。
RUNNABLE线程可运行(可能正在执行或等待CPU调度)。- 锁竞争失败 → BLOCKED
- 调用wait()WAITING
- 调用sleep()TIMED_WAITING
- run()执行完毕 → TERMINATED
线程正常执行业务逻辑。
BLOCKED线程因等待锁而阻塞。锁被释放 → RUNNABLE竞争synchronized锁时。
WAITING线程主动进入无限期等待(需其他线程显式唤醒)。notify()unpark()interrupt()RUNNABLE调用wait()join()LockSupport.park()
TIMED_WAITING线程进入有限期等待(超时或被中断后恢复)。超时/被notify()unpark()interrupt()RUNNABLE调用sleep()wait(long)join(long)
TERMINATED线程执行完毕或异常终止。终态,无法转换。run()方法执行结束或抛出未捕获异常。

四、关键注意事项

  1. 状态查询:通过Thread.getState()获取当前线程状态。
  2. 状态转换的触发条件
    • BLOCKED:仅因锁竞争失败导致,需释放锁后恢复。
    • WAITING/TIMED_WAITING:需外部干预(如notify()interrupt())或超时才能恢复。
  3. 中断的影响interrupt()可能使线程从WAITINGTIMED_WAITING状态恢复(取决于具体方法实现)。
  4. RUNNABLE状态的特殊性:包含两种子状态:
    • 可运行:等待CPU调度。
    • 正在运行:当前正在执行。

通过以上状态管理和转换逻辑,可以更清晰地控制线程行为并避免死锁或资源竞争问题。

相关文章:

  • 汽车安全确认等级-中国等保
  • springboot基于session实现登录
  • 深入解析过滤器模式(Filter Pattern):一种灵活高效的设计模式
  • 让vscode远程开发也可以图形显示
  • 基于BClinux8部署Ceph 19.2(squid)集群
  • Coco AI 智能检索 Hugo Blog 集成指南
  • 我的python学习记录
  • 【蓝桥杯】省赛:分糖果(思维/模拟)
  • Kotlin 基础语法
  • C# 语法糖
  • Docker build 会在本地产生巨大的文件
  • 计算机视觉技术探索:美颜SDK如何利用深度学习优化美颜、滤镜功能?
  • 如何选择合适的SSL服务器证书
  • 深入理解 Vue.js 中的 <keep-alive>:使用技巧与注意事项
  • c#:使用Modbus RTU协议
  • 高频SQL50题 第一天 | 1757. 可回收且低脂的产品、584. 寻找用户推荐人、595. 大的国家、1683. 无效的推文、1148. 文章浏览 I
  • 3.19刷题
  • 【VUE】day05-ref引用
  • 3.18-1
  • 基于Spring Boot的冷链物流系统的设计与实现的设计与实现(LW+源码+讲解)
  • 淘宝页面设计模板/哈尔滨优化推广公司
  • 网站好坏的指标/网站关键词优化网站推广
  • 营销型网站 财务咨询公司/网络营销乐云seo
  • 微商做百度推广发哪个网站收录高/谷歌seo是什么职业
  • 什么网站可以做国外生意/网站诊断工具
  • 哪里有网站制作设计/图片百度搜索