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

Java线程的几种状态

线程状态我们在此介绍六种线程状态 1.NEW 2.RUNNABLE 3.TIMED_WAITING 4.BLOCKED 5.WAITING 6.TERMINATED

1.初始状态 (NEW)

当一个线程对象被创建但尚未调用 start() 方法时,线程处于初始状态。此时,线程还没有开始执行。

通俗的讲就是安排了工作但是没未开始行动

2.运行状态 (RUNNABLE)

Java 将就绪(ready)和运行中(running)两种状态统称为运行状态。当线程对象调用 start() 方法后,线程进入就绪状态,等待被线程调度选中,获取 CPU 的使用权。获得 CPU 时间片后,线程进入运行中状态。

通俗来讲 处于两种状态:1.线程在cpu上执行 2.线程随时在cpu上执行

3.终止状态 (TERMINATED)

当线程的 run() 方法执行完毕或主线程的 main() 方法执行完毕时,线程进入终止状态。此时,线程已经完成了它的生命周期,不能再复生。

通俗来讲 内核上的线程已经结束 而Thread对象还在

4.超时等待状态 (TIMED_WAITING)

与等待状态不同,超时等待状态的线程在指定时间后会自动返回。线程在调用带有超时参数的方法(如 sleep(long millis)wait(long timeout) 等)时进入此状态。

在此多提一句 jconsole 可以来查看线程状态

5.阻塞状态 (BLOCKED)

当线程试图获取一个被其他线程持有的锁时,线程进入阻塞状态。此时,线程无法继续执行,直到获得所需的锁。

6.等待状态 (WAITING)

线程进入等待状态,需要等待其他线程做出一些特定动作(如通知或中断)才能继续执行。处于这种状态的线程不会被分配 CPU 执行时间。

通俗来说就是死等 

7.线程各状态关系

这张为粗略展示几种状态的关系

Java线程的生命周期包含6种状态,它们之间的转换逻辑如下:

1. NEW(新建)
   ▶ 触发条件:`new Thread()`但未调用`start()`
   ▶ 唯一出口:调用`start()` → 进入RUNNABLE

2. RUNNABLE(可运行)
   ▶ 包含两种子状态:
   - 就绪(Ready):等待CPU时间片
   - 运行中(Running):正在执行代码
   ▶ 可能转换路径:
   - 调用`Object.wait()` → 进入WAITING
   - 调用`Thread.sleep(n)`/`wait(n)`/`join(n)` → 进入TIMED_WAITING
   - 尝试获取被占用的同步锁 → 进入BLOCKED
   - 运行结束 → 进入TERMINATED

3. BLOCKED(阻塞)
   ▶ 触发条件:等待进入`synchronized`同步块/方法
   ▶ 唯一出口:获取到对象锁 → 返回RUNNABLE

4. WAITING(无限等待)
   ▶ 触发方法:`Object.wait()`/`Thread.join()`/`LockSupport.park()`
   ▶ 唤醒方式:
   - `Object.notify()`/`notifyAll()`
   - 目标线程终止(针对`join()`)
   - `LockSupport.unpark()`
   ▶ 唤醒后 → 返回**RUNNABLE

5. TIMED_WAITING(限期等待)
   ▶ 触发方法:带超时参数的`wait(time)`/`join(time)`/`sleep(time)`等
   ▶ 两种退出方式:
   - 超时时间到 → 自动返回RUNNABLE
   - 被其他线程唤醒(如`interrupt()`) → 返回RUNNABLE

6. TERMINATED(终止)
   ▶ 触发条件:
   - `run()`方法正常结束
   - 线程抛出未捕获异常
   ▶ 重要特性:终止状态不可逆,无法再次激活

关键转换逻辑补充说明:
- 处于WAITING/TIMED_WAITING的线程被`interrupt()`时:
  - 立即退出等待状态 → 返回RUNNABLE
  - 同时抛出`InterruptedException`

- BLOCKED**与WAITING的本质区别:
  - BLOCKED是主动竞争同步锁时的被动阻塞
  - WAITING是主动调用API触发的等待

- 状态转换不可逆性:
  - TERMINATED是最终状态
  - 从NEW到RUNNABLE只能发生一次

该状态机模型揭示了Java线程调度与同步机制的内在逻辑,理解这些状态转换关系对于诊断线程阻塞、死锁等问题至关重要。建议结合jconsole等工具观察实际线程状态,可有效提升多线程程序的调试能力。

http://www.xdnf.cn/news/348.html

相关文章:

  • 文章记单词 | 第37篇(六级)
  • 最优树搜索策略
  • 民办生从零学C的第十一天:操作符
  • pip list | grep paho-mqtt 如何查看这个包的保存路径
  • 三轴云台之模块设计篇
  • 网工_FTP协议
  • QML 自定义组件外观和行为
  • 一个可以自定义Java服务名日志打印的小工具
  • TCP的三次握手和四次挥手
  • 【IDEA2020】 解决开发时遇到的一些问题
  • 中华传承-医山命相卜-铁板神数
  • 快速入门smolagents
  • FreeFileSync:文件同步对比工具
  • canal安装使用V1.1.4
  • 《数据牢笼》-来自DeepSeek
  • ‌2025年教育AI实战项目
  • 曲棍球·棒球1号位
  • 2025大模型推理框架选型全指南:高并发推理架构深度拆解
  • 解决:QTcpSocket: No such file or directory
  • yolov8 框架自带模型体验功能
  • FME实现矢量建筑面shp拉伸并贴纹理
  • Windows10,11账户管理,修改密码,创建帐户...
  • 米托蒽醌和阿克拉霉素 髓外 aml 疗效
  • Top100(26-30)
  • 编程常见错误归类
  • keil5软件配置以及使用技巧
  • QML 自定义控件指南
  • 【dify实战】chatflow结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载
  • 阿里AI模型获FDA“突破性”认证,胰腺癌早筛实现关键突破|近屿智能邀你入局AIGC大模型
  • SSM省市区三级联动和三表联查附带数据库