【java基础】线程状态转化

在Java中,线程有六种基本状态,这些状态反映了线程在其生命周期中的不同阶段。线程的状态转换是由操作系统和JVM(Java虚拟机)调度机制共同控制的。以下是线程的六种状态及其转换:

  1. NEW(新建)

    • 线程对象被创建但尚未启动,调用start()方法前的状态。
  2. RUNNABLE(可运行)

    • 线程已经启动,正在执行,或者准备执行。线程处于此状态时,它可能正在等待CPU时间片,或者正在使用CPU资源执行任务。
    • 从NEW状态转换到RUNNABLE状态是通过调用Thread.start()方法实现的。
  3. BLOCKED(阻塞) 或者称为 WAITING(等待)TIMED_WAITING(计时等待)

    • WAITING 和 TIMED_WAITING 是线程等待某个条件发生的状态,例如调用了Object.wait()Thread.sleep(long millis)或者join()等方法。
    • BLOCKED 状态通常指线程在等待锁(monitor lock)以进入同步块或方法。
  4. TERMINATED(终止)

    • 线程已经执行完毕或因异常而停止执行。

状态转换图如下:

复制代码
NEW -> RUNNABLE -> BLOCKED / WAITING / TIMED_WAITING -> RUNNABLE -> TERMINATED
  • 当线程由NEW状态变为RUNNABLE状态时,是因为调用了start()方法。
  • 从RUNNABLE状态转换到BLOCKED、WAITING或TIMED_WAITING状态,是因为线程遇到了某种阻塞条件,如等待锁、等待通知或等待特定时间。
  • 从BLOCKED、WAITING或TIMED_WAITING状态返回到RUNNABLE状态,是因为阻塞条件消失,例如获得了锁、收到了通知或等待时间结束。
  • 最终,线程会从RUNNABLE状态转换到TERMINATED状态,这是因为线程的执行体(run()方法)完成了或抛出了未捕获的异常。

值得注意的是,Java线程的状态转换是高度依赖于JVM和操作系统调度器的,因此,除了通过调用start()方法和Thread.sleep()Object.wait()等方法外,开发者通常无法直接控制状态转换的具体时机。

相关推荐
MY_TEUCK3 小时前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
2401_873479404 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope4 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python4 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
朝新_4 小时前
【Spring AI 】图像与语音模型实战
java·人工智能·spring
RH2312115 小时前
2026.4.16Linux 管道
java·linux·服务器
zmsofts5 小时前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis
浪浪小洋5 小时前
c++ qt课设定制
开发语言·c++
charlie1145141915 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
故事和你915 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论