news 2026/1/10 11:48:04

Java 线程状态详解:从观察到理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 线程状态详解:从观察到理解

一、观察线程的所有状态

在 Java 中,线程的状态是由 Thread.State 枚举定义的,一共有 6 种状态。这些状态代表了线程从创建到销毁的各个阶段。我们可以通过 Thread.getState() 方法来获取当前线程的状态。

以下是所有线程状态的列表:

  • NEW:线程刚刚创建,但尚未启动(调用 start() 方法之前)。
  • RUNNABLE:线程已经启动,正在执行或等待 CPU 调度。这包括线程在运行或就绪状态。
  • BLOCKED:线程正在等待监视器锁(monitor lock),通常发生在进入 synchronized 块或方法时被阻塞。
  • WAITING:线程正在无限期等待另一个线程的特定操作,例如调用 Object.wait()、Thread.join() 或 LockSupport.park()。
  • TIMED_WAITING:类似于 WAITING,但有时间限制,例如调用 Thread.sleep()、Object.wait(long timeout) 或 Thread.join(long millis)。
  • TERMINATED:线程执行完成或异常退出,已结束生命周期。

二、线程状态和状态转移的意义

状态转移的意义:

  • NEW → RUNNABLE:调用 thread.start()。意义:启动线程,进入可执行状态。这是线程“出生”的关键一步。
  • RUNNABLE → BLOCKED:尝试获取已被占用的锁。意义:体现了互斥访问的必要性,避免数据竞争。
  • RUNNABLE → WAITING:调用 wait()、join() 等。意义:实现线程协作,如生产者-消费者模式。
  • RUNNABLE → TIMED_WAITING:调用 sleep() 或带时限的 wait()。意义:引入时间维度,适用于延迟执行或超时机制。
  • BLOCKED → RUNNABLE:获取到锁。意义:阻塞结束,继续执行。
  • WAITING/TIMED_WAITING → RUNNABLE:收到 notify()、超时或中断。意义:唤醒机制,确保线程不会永久卡住。
  • RUNNABLE → TERMINATED:run() 方法执行完毕或抛出未捕获异常。意义:正常或异常结束,释放资源。

三、观察线程的状态和

观察 1:关注 NEW 、 RUNNABLE 、 TERMINATED 状态的转换

public class Observation1 { public static void main(String[] args) throws InterruptedException { // 创建线程 (NEW 状态) Thread simpleThread = new Thread(() -> { System.out.println("Thread is running... Doing some work."); // 模拟工作,结束后自然进入 TERMINATED }); // 观察 NEW 状态 System.out.println("State after creation: " + simpleThread.getState()); // NEW // 启动线程 (NEW -> RUNNABLE) simpleThread.start(); Thread.sleep(100); // 短暂等待,确保线程进入 RUNNABLE System.out.println("State after start: " + simpleThread.getState()); // RUNNABLE // 等待线程结束 (RUNNABLE -> TERMINATED) simpleThread.join(); System.out.println("State after termination: " + simpleThread.getState()); // TERMINATED } }

观察 2:关注 WAITING 、 BLOCKED 、 TIMED_WAITING 状态的转换

public class Observation2 { private static final Object lock = new Object(); public static void main(String[] args) throws InterruptedException { // 创建工作者线程 Thread workerThread = new Thread(() -> { try { // 进入 TIMED_WAITING (sleep) System.out.println("Entering TIMED_WAITING via sleep..."); Thread.sleep(1000); // 进入 WAITING (wait) synchronized (lock) { System.out.println("Entering WAITING via wait..."); lock.wait(); } // 模拟工作结束 System.out.println("Worker thread resuming after notify."); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); // 创建阻塞模拟线程:先占用锁 Thread blockerThread = new Thread(() -> { synchronized (lock) { try { System.out.println("Blocker holding lock for 2 seconds..."); Thread.sleep(2000); // 占用锁,迫使其他线程 BLOCKED } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); // 启动 blocker 先占用锁 blockerThread.start(); Thread.sleep(100); // 确保 blocker 先运行 // 启动 worker (进入 RUNNABLE) workerThread.start(); Thread.sleep(100); System.out.println("Worker state after start: " + workerThread.getState()); // RUNNABLE // 观察 TIMED_WAITING (sleep) Thread.sleep(500); System.out.println("Worker state during sleep: " + workerThread.getState()); // TIMED_WAITING // 等待 sleep 结束,worker 尝试 wait,但需先获取锁(可能 BLOCKED) Thread.sleep(1000); System.out.println("Worker state when trying to acquire lock for wait: " + workerThread.getState()); // BLOCKED (如果 blocker 还在占用) // 等待 blocker 释放锁,worker 进入 WAITING Thread.sleep(1500); System.out.println("Worker state during wait: " + workerThread.getState()); // WAITING // 唤醒 worker (WAITING -> RUNNABLE) synchronized (lock) { lock.notify(); } Thread.sleep(100); System.out.println("Worker state after notify: " + workerThread.getState()); // RUNNABLE 或 TERMINATED // 等待结束 workerThread.join(); blockerThread.join(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 6:58:30

Spring Boot 应用开发:从理论到实践的成长之旅

在本学期 Spring Boot 应用开发课程的学习中,我完成了从 “对后端开发一知半解” 到 “能独立搭建完整 Web 项目” 的蜕变。这门课程不仅让我掌握了 Spring Boot 的核心技术,更教会了我用工程化思维解决实际问题,以下是我结合理论学习与实践操…

作者头像 李华
网站建设 2025/12/20 10:00:41

在Zabbix Server使用PHP编译一个扩展模块

场景:一次性返回所有在线 Agent 的 CPU 利用率平均值(%) Zabbix Server的PHP相关目录 # 一台已经跑通的 Zabbix 7.0 实例(Server Web Agent) # 参考 CentOS 7 源码编译路径: PHP_PREFIX/usr/local/zabbix…

作者头像 李华
网站建设 2025/12/27 21:00:43

Dify与Spring AI版本适配实战指南(兼容性问题全收录)

第一章:Dify与Spring AI版本兼容性概述在构建基于AI的现代企业级应用时,Dify 与 Spring AI 的集成成为关键的技术选型之一。两者在生态整合、模型调用抽象和微服务架构支持方面具备天然契合点,但其版本间的兼容性直接影响系统的稳定性与功能可…

作者头像 李华
网站建设 2026/1/6 13:18:40

还在手动注释细胞类型?自动化R流程让你效率飙升(附完整代码)

第一章:空间转录组细胞类型注释的挑战与机遇空间转录组技术的发展使得在保留组织空间结构的前提下研究基因表达成为可能,然而细胞类型注释仍是其中的关键挑战。由于空间分辨率的限制,单个空间点往往包含多个细胞,导致表达信号混合…

作者头像 李华
网站建设 2026/1/1 2:42:19

鸿蒙高性能绘制离屏渲染

什么离屏渲染 离屏渲染也叫双缓冲渲染,也就是说有两块画布,一个画布在后台负责内容绘制,一个画布用于在上屏显示。这样的好处就是绘制过程中不会产生屏幕抖动,举个例子,当你在画板上作画时,旁边有人盯着你看,当你绘制完一幅图时, 你再用橡皮擦去擦掉。擦掉的过程就会人…

作者头像 李华
网站建设 2025/12/28 9:43:20

【高阶风控模型进阶指南】:基于R语言的相关性矩阵优化策略

第一章:高阶风控中相关性矩阵的核心作用在现代金融与信贷风控体系中,风险因子间的相互依赖关系日益复杂,相关性矩阵作为量化多维变量间线性关联的核心工具,发挥着不可替代的作用。它不仅揭示了不同资产、用户行为或风险指标之间的…

作者头像 李华