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

代码讲解Java线程转换

1. 新建(New)

    当我们使用 new Thread() 创建线程对象后,Thread.start()方法前,线程处于新建状态。

    未重写run方法 

        输出NEW新生状态

  重写run方法 

        输出NEW新生状态

2. 就绪(Runnable)

   调用 start()方法后,线程进入就绪状态。

   线程此时具有运行资格,但 是否运行取决于操作系统的调度器。

   Java线程没有区分就绪和运行状态

可以看到调用start方法后,线程处于Runnable运行状态。

但这不代表这个线程没有处于运行状态,

Java 中的 Thread.State.RUNNABLE 包含了 “就绪”和“运行”两种状态的统称,它并不区分线程是正在 执行(Running),还是仅仅处于 就绪(Ready)。

所以我们无法进行区分

为什么不提供 Running 状态?

因为: 在 Java 层,你无法准确知道某线程是不是“此刻正好被 CPU 执行”,这个是 OS 调度器控制的; 如果提供了 “RUNNING” 状态,反而可能误导开发者(因其可能变化极快,每毫秒都可能被抢占)。

3. 运行(Running)

   当线程被操作系统调度后,获得 CPU 时间片,才会进入运行状态。

    实际执行线程中的 run()方法。

   需要注意:Java 中的 就绪 + 运行 == 操作系统的 Running 状态。

4. 阻塞状态(Blocked / Waiting / Timed Waiting)

   同步阻塞(Blocked:线程试图进入 synchronized`块或方法,但未获得锁。)

import java.util.concurrent.ThreadLocalRandom;public class ThreadStatus{private static Object object = new Object(); //锁对象public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(()->{synchronized (object){System.out.println("线程1正在运行");while (true){}}});Thread thread2= new Thread(()->{synchronized (object){System.out.println("线程2正在运行");while (true){}}});thread1.start();thread2.start();Thread.sleep(100); //保证某一个线程拿到锁System.out.println("线程1状态"+thread1.getState());System.out.println("线程2状态"+thread2.getState());}}

状态输出

   等待(Waiting:线程调用 `wait()` / `join()` 等方法进入无限等待。

  超时等待(Timed Waiting):线程调用 `sleep()` / `wait(timeout)` / `join(timeout)` 等进入限时等

  这些状态均由运行状态进入,且恢复运行都需先进入“就绪”状态再等待调度。

5. 死亡(Terminated)

   当线程的 `run()` 方法执行完毕,或者抛出未捕获异常,线程进入死亡状态,生命周期终结。

如果想要具体的Java代码线程转化,可以关注+私信,回复666

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

相关文章:

  • 达梦数据库-学习-21-C 外部函数
  • 使用vscode MSVC CMake进行C++开发和Debug
  • 智能指针
  • 20250523在荣品的PRO-RK3566开发板的Android13下解决千兆网异常的问题【硬件部分】
  • 【算法系列】协同过滤算法
  • 通过vue-pdf和print-js实现PDF和图片在线预览
  • bi平台是什么意思?bi平台具体有什么作用?
  • Unreal渲染源码简读(一)RHI/Shader
  • MacOS Docker 启动 RustDesk Server OSS
  • 前端状态管理介绍(React状态管理)(通过管理状态来控制UI的呈现,确保数据的一致性和可维护性)(界面与数据分离、可预测性、组件化、响应式更新)
  • 高可用架构设计要点
  • 钉钉出口IP有哪些
  • linux strace调式定位系统问题
  • python学习day2:进制+码制+逻辑运算符
  • 云存储迁移遇瓶颈?大文件跨平台传输加速指南
  • hbuilder中h5转为小程序提交发布审核
  • Kafka Producer 如何实现Exactly Once消息传递语义
  • 用HTML5+JavaScript实现汉字转拼音工具
  • 使用KubeKey快速部署k8s v1.31.8集群
  • 车载诊断架构 --- 车载诊断有那些内容(下)
  • 技术服务业-首套运营商网络路由5G SA测试专网搭建完成并对外提供服务
  • threejs 四元数(Quaternion)和欧拉角(Euler)学习
  • 学习Raft共识算法基本原理
  • 了解Android studio 初学者零基础推荐(3)
  • Python版scorecardpy库woebin函数使用
  • 安全自动化与AI驱动防御
  • 《数据结构笔记三》:单链表(创建、插入、遍历、删除、释放内存等核心操作)
  • 教育行业课件共享难题:大文件分发效率优化方案
  • 广东省省考备考(第十八天5.23)—言语:语句排序题(听课后强化训练)
  • 对比关系型数据库与NoSQL数据库