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

并发--并发中的线程状态及不同状态下线程所在队列

一、Java 线程的几种状态(Thread.State

在 Java 中,线程有以下几种状态(java.lang.Thread.State 枚举):

  1. NEW(新建)

    • 线程对象被创建,但还没有调用 start() 方法。

    • 不会进入调度队列。

  2. RUNNABLE(可运行)

    • 线程已经调用了 start(),等待 CPU 调度。

    • 这里的 RUNNABLE 包含:

      • Ready(就绪):在 就绪队列(Ready Queue) 中,等待 CPU 时间片。

      • Running(运行中):正在占用 CPU 执行。

  3. BLOCKED(阻塞)

    • 线程在等待获取某个 对象锁(monitor)

    • 出现场景:synchronized 进入临界区失败。

    • 所在队列:锁的 EntryList(阻塞队列)

  4. WAITING(无限期等待)

    • 线程主动进入等待状态,直到被其他线程显式唤醒。

    • 出现场景:

      • Object.wait()(无超时)

      • LockSupport.park()

    • 所在队列:对象的 WaitSet(等待队列)

  5. TIMED_WAITING(限期等待)

    • 和 WAITING 类似,但有超时时间。

    • 出现场景:

      • Thread.sleep(timeout)

      • Object.wait(timeout)

      • join(timeout)

      • LockSupport.parkNanos() / parkUntil()

    • 所在队列:等待队列(WaitSet),带超时。

  6. TERMINATED(终止)

    • 线程执行完毕,生命周期结束,不会再进入任何队列。


二、线程在不同状态下的队列位置

  1. 就绪队列(Ready Queue)

    • 存放处于 RUNNABLE-Ready 的线程。

    • 等待 CPU 调度。

    • 特点:只有获得 CPU 时间片的线程才能进入 Running

  2. 阻塞队列(EntryList / Contention Queue)

    • 存放 BLOCKED 状态线程。

    • 线程因获取不到锁而阻塞。

    • 一旦锁被释放,JVM 会从该队列中唤醒一个或多个线程,进入就绪队列(不是立即运行)。

  3. 等待队列(WaitSet)

    • 存放 WAITING / TIMED_WAITING 状态的线程。

    • 线程主动调用 wait() / join() / sleep() 进入。

    • 必须通过 notify() / notifyAll() / 超时 才能退出。

    • 被唤醒后不会直接运行,而是进入 就绪队列 等待 CPU。


三、状态与队列的对应关系

状态触发条件所在队列退出方式
NEWnew Thread()调用 start() → 就绪队列
RUNNABLE (Ready)start() 后 / 被唤醒就绪队列CPU 调度 → Running
RUNNINGCPU 时间片分配CPU时间片完 / 阻塞 / 等待
BLOCKED申请锁失败阻塞队列(EntryList)锁释放后 → 就绪队列
WAITINGwait() / park()等待队列(WaitSet)notify() / unpark() → 就绪队列
TIMED_WAITINGwait(timeout) / sleep(timeout)等待队列(WaitSet)超时 / notify() → 就绪队列
TERMINATEDrun() 执行结束生命周期结束

四、关键点总结

  1. 就绪队列:存放所有等待 CPU 的线程。

  2. 阻塞队列:存放获取不到锁的线程。

  3. 等待队列:存放执行 wait() / sleep() / join() 等等待操作的线程。

  4. notify()/notifyAll() 只会把线程从 等待队列 移动到 就绪队列,不直接运行。

  5. 锁释放 会把线程从 阻塞队列 移动到 就绪队列

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

相关文章:

  • React学习教程,从入门到精通, React 入门指南:创建 React 应用程序的语法知识点(7)
  • OpenCV-CUDA 图像处理
  • 数据库常见故障类型
  • 知识产品和标准化
  • 在 Qt 中加载 .qm 翻译文件
  • 跳跃游戏(二):DFS 求解最少跳跃次数与最优路径
  • 专项智能练习(Word)
  • JavaSE:抽象类和接口
  • 计算机视觉(五):blur
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • 贵州在假期及夏天结束后保持旅游活力的策略分析
  • AI如何重塑电力工程设计?揭秘良策金宝AI的六大“超能力”
  • SQLSERVER关键字:N
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 算法练习——189.轮转数组
  • 【逆序对 博弈】P10737 [SEERC 2020] Reverse Game|普及+
  • 【开题答辩全过程】以 基于JSP的养生网站设计与实现为例,包含答辩的问题和答案
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • Linux 进程间通信(IPC)
  • 大型语言模型微调 内容预告(69)
  • 【Docker】2025版Ubuntu 22.04 安装 Docker Docker Compose 指南
  • 电力工程师的AI时代已来,这6大功能彻底颠覆传统工作模式
  • 系统性学习数据结构-第二讲-顺序表与链表
  • 金融数据安全
  • 基于单片机汽车防盗系统/汽车安全防丢系统
  • 动态代理设计模式
  • 多模态大语言模型部署
  • Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点
  • 二、感知机
  • 高防IP防护效果评估全攻略:从指标解读到实战测试