Java线程状态及其流转

在Java编程中,线程是一种重要的并发实体。为了更好地理解和管理多线程应用程序,我们需要清楚线程的不同状态及其流转机制。本文将详细介绍Java中线程的几种主要状态以及它们之间的转换关系。

一、线程状态概述

Java线程的生命周期有多个状态,主要包括以下几种:

  1. 新建状态(New)
  2. 就绪状态(Runnable)
  3. 运行状态(Running)
  4. 阻塞状态(Blocked)
  5. 等待状态(Waiting)
  6. 超时等待状态(Timed Waiting)
  7. 终止状态(Terminated)

每一种状态代表着线程在其生命周期中的不同阶段,下面我们将逐一解析每个状态以及状态之间的流转。

二、各线程状态详解

1. 新建状态(New)

当创建一个线程对象时,该线程处于新建状态,此时线程尚未开始执行。只有当你调用 start() 方法时,新建状态的线程才能进入就绪状态。

示例代码

Thread thread = new Thread(() -> {System.out.println("线程正在执行...");
});

2. 就绪状态(Runnable)

新建状态的线程在调用 start() 方法后进入就绪状态。此时线程处于等待系统调度的状态,准备好随时启动执行。

示例代码

thread.start(); // 线程进入就绪状态

注意:就绪状态的线程不一定在运行,它只是等待线程调度器分配CPU时间。

3. 运行状态(Running)

当线程被分配到CPU时,线程进入运行状态。此时,线程正在执行它的任务。

  • 线程从就绪状态转换为运行状态是由线程调度器决定的。
  • 运行状态的线程可能会因为时间片用尽、调用 wait()sleep() 方法或由于其他线程抢占等原因而转移到其他状态。

4. 阻塞状态(Blocked)

阻塞状态的线程是因为尝试获取锁(synchronized)而被阻塞。当两个或多个线程需要相同的资源(例如一个对象的锁)时,只有获得锁的线程才能执行,而其他线程会被阻塞。

示例代码

synchronized (someObject) {// 执行的代码
}

如果另一个线程已经持有 someObject 的锁,则当前线程会进入阻塞状态,直到能够获取锁为止。

5. 等待状态(Waiting)

线程进入等待状态通常是由于调用了以下方法之一:

  • Object.wait()
  • Thread.join()
  • LockSupport.park()

在等待状态下的线程不会被线程调度器选中执行,直到其他线程调用 notify()notifyAll() 或者 join() 的线程结束。

示例代码

synchronized (someObject) {someObject.wait(); // 进入等待状态
}

6. 超时等待状态(Timed Waiting)

超时等待状态是一种特殊的等待状态,线程等待某个条件但设定了超时时间。线程会在等待时间结束后自动恢复到就绪状态。

例如,线程调用 Thread.sleep(millis)Object.wait(millis)

示例代码

Thread.sleep(1000); // 线程等待1秒

7. 终止状态(Terminated)

当线程的 run() 方法执行完毕,或者因为未处理异常而终止时,线程进入终止状态。此状态的线程无法再重新启动。

示例代码

public void run() {// 执行的代码
} // 线程执行到此,进入终止状态

线程一旦进入终止状态,它的生命周期就结束了。

三、线程状态流转

下面是一个详细的表格,内容包括线程状态、状态转换、触发条件以及实例代码说明。这个表格将帮助你更清晰地理解Java中线程的状态及其转换过程。

线程状态状态描述状态转换触发条件示例代码
新建(New)线程对象被创建,但尚未启动。调用 start() 方法调用 Thread t = new Thread()Thread t = new Thread();
就绪(Runnable)线程已启动,准备执行,但 CPU 未分配给它。由线程调度器分配 CPU 或调用 yield()调用 start() 后,等待 CPU 调度t.start();
运行(Running)线程正在执行任务。调度器分配 CPU 资源,或因时间片用尽被抢占CPU 调度// 代码在 run() 方法中执行
阻塞(Blocked)线程等待获取其他线程持有的锁。获取锁成功,或其他条件通知当前线程调用了 synchronized,但未获取锁synchronized(lock) { ... }
等待(Waiting)线程等待其他线程通知。由其他线程调用 notify()notifyAll()调用 wait()join()lock.wait();
超时等待(Timed Waiting)线程等待某个条件,但设定了超时时间。超时结束,或被调用 notify()调用 Thread.sleep(millis)wait(millis)Thread.sleep(1000);
终止(Terminated)线程生命周期结束。无法再转换,无论是正常结束还是异常run() 方法执行完毕或抛出未处理的异常public void run() { ... }

状态转换详细说明

  1. 新建(New)→ 就绪(Runnable)

    • 条件:调用 start() 方法,使线程准备执行。
    • 示例代码
      Thread thread = new Thread(() -> { /* 执行的任务 */ });thread.start();  // 线程从新建状态转到就绪状态
      
  2. 就绪(Runnable)→ 运行(Running)

    • 条件:线程调度器将 CPU 时间片分配给线程,使其进入运行状态。
    • 示例:后台执行的任务,调度器根据优先级选择线程。
  3. 运行(Running)→ 阻塞(Blocked)

    • 条件:线程尝试访问 synchronized 块或方法时,发现已被其他线程占用。
    • 示例代码
      synchronized(lock) {    // 访问被锁住的资源}
      
  4. 运行(Running)→ 等待(Waiting)

    • 条件:调用 wait()join()LockSupport.park(),进入等待状态。
    • 示例代码
      synchronized (lock) {    lock.wait(); // 进入等待状态,直到有其他线程调用notify}
      
  5. 运行(Running)→ 超时等待(Timed Waiting)

    • 条件:调用带有时间参数的方法,如 Thread.sleep(millis)wait(millis)
    • 示例代码
      Thread.sleep(1000); // 线程暂停1秒进入超时等待状态
      
  6. 阻塞(Blocked)→ 就绪(Runnable)

    • 条件:成功获取锁,线程重新进入就绪状态,等待 CPU 调度。
    • 示例:当锁被释放后,阻塞的线程尝试获取锁,成功时转为就绪状态。
  7. 等待(Waiting)→ 就绪(Runnable)

    • 条件:其他线程调用了 notify()notifyAll(),唤醒等待线程。
    • 示例代码
      // 在另一个线程synchronized (lock) {    lock.notify(); // 唤醒一个等待的线程}
      
  8. 超时等待(Timed Waiting)→ 就绪(Runnable)

    • 条件:等待超时到达,线程自动恢复就绪状态。
    • 示例:如上所示的 Thread.sleep 达到指定时间。
  9. 运行(Running)→ 终止(Terminated)

    • 条件:线程执行完毕,或者抛出未捕获的异常,线程自然结束。
    • 示例代码
      public void run() {    // 一些代码}  // 代码完成或抛出异常则终止
      

四、总结

了解Java线程的各个状态及其流转机制是掌握并发编程的基础。通过清晰的状态流转关系,可以帮助我们更有效地管理和调试多线程应用程序。希望本文能帮助到你在多线程编程中的学习与应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW双光子显微镜开发

基于LabVIEW 开发高性能双光子显微镜系统,聚焦于生物样本深层成像与纳米材料三维表征。实现了超快激光控制、多维数据采集与实时图像重建。系统采用飞秒激光光源与高精度振镜扫描模块,结合 LabVIEW 的 FPGA 实时控制能力,可对活体组织、荧光纳…

数据库操作-MySQL-4(JDBC编程)

JDBC:通过Java代码操作mysql数据库,数据库会提供一些API供我们调用 MySQL、Oracle、等API有差异,但是Java统一了所有接口,即JDBC; 原始api-驱动包(类似转接头)-统一的api-Java 驱动包&#xff1…

windows修改跃点数调整网络优先级

Windows有两个网卡,一个有线网卡,一个无线网卡,通过修改跃点数来调整优先使用的网卡,这种只是众多设置方式中的其中一种设置方式 文档编写时间:2025年6月 1.打开电脑的网络连接 cmd--ncpa.cpl 在cmd中运行ncpa.cpl可…

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题。主要涉及线性回归、回归的显著性、回归系数的置信区间。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…

【深入 LangChain 的 Model I/O】提示设计、模型调用与输出解析全解析

目录 什么是 Model I/O&#xff1f; 一、提示模板&#xff08;PromptTemplate&#xff09; 1.1 什么是提示模板&#xff1f; 1.2 常见提示模板类型 二、模型调用&#xff08;Model Predict&#xff09; 三、输出解析&#xff08;Output Parser&#xff09; 综合示例&…

OD 算法题 B卷【跳格子2】

文章目录 跳格子2 跳格子2 小明和朋友玩跳格子游戏&#xff0c;有n个连续格子组成的圆圈&#xff0c;每个格子有不同的分数&#xff0c;小朋友可以选择从任意格子起跳&#xff0c;但是不能跳连续的格子&#xff0c;不能回头跳&#xff0c;也不能超过一圈&#xff0c;给定一个代…

客户线索商机怎么管?客户线索商机管理工具哪个好?

做销售、搞运营的朋友肯定都有过这种烦恼&#xff1a;每天收到海量客户线索&#xff0c;却不知道从哪条开始跟进&#xff1b;试了好几个管理工具&#xff0c;要么功能太复杂&#xff0c;要么用起来不趁手。其实选对客户线索商机管理工具&#xff0c;就像找到靠谱的 “销售小助手…

008房屋租赁系统技术揭秘:构建智能租赁服务生态

房屋租赁系统技术揭秘&#xff1a;构建智能租赁服务生态 在房地产租赁市场日益活跃的当下&#xff0c;房屋租赁系统成为连接房东与租客的重要数字化桥梁。该系统集成用户管理、房屋信息等多个核心模块&#xff0c;面向管理员、房东和用户三类角色&#xff0c;通过前台展示与后…

SpringBoot 系列之集成 RabbitMQ 实现高效流量控制

系列博客专栏&#xff1a; JVM系列博客专栏SpringBoot系列博客 Spring Boot 2.2.1 集成 RabbitMQ 实现高效流量控制 在分布式系统中&#xff0c;消息队列是实现异步通信、解耦服务的重要组件。RabbitMQ 作为一款成熟的开源消息队列&#xff0c;广泛应用于各类项目中。本文将…

新视讯影视官网入口,影视动漫在线播放网站

新视讯影视是一个免费为广大追剧迷提供在线播放服务的影视平台&#xff0c;深受众多影视爱好者的喜爱。它涵盖了大量免费的VIP电视剧资源、最新上映的大片、好看的综艺节目以及动漫视频&#xff0c;是一个播放速度快、资源多的免费影视网站。用户无需注册或登录&#xff0c;即可…

【使用】【经验】docker 清理未使用的镜像的命令

docker images prune在 Docker 中清理未使用的镜像&#xff08;包括悬空镜像和完全未被引用的镜像&#xff09;&#xff0c;可以使用以下命令&#xff1a; 1. ​删除所有悬空镜像​&#xff08;推荐常用&#xff09; docker image prune​悬空镜像 (dangling images)​​ 是指…

OpenCV CUDA模块图像处理------图像融合函数blendLinear()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数执行 线性融合&#xff08;加权平均&#xff09; 两个图像 img1 和 img2&#xff0c;使用对应的权重图 weights1 和 weights2。 融合公式…

【Typst】6.布局函数

概述 上节我们介绍了文档结构元素的函数&#xff0c;本节介绍一些控制布局使用的函数&#xff0c;掌握他们之后你可以更进一步的控制页面元素的布局。 系列目录 1.Typst概述2.Typst标记语法和基础样式3.Typst脚本语法4.导入、包含和读取5.文档结构元素与函数6.布局函数 对齐…

【音视频】FFmpeg 编码H265

一、概述 实现了读入本地yuv文件&#xff0c;通过libx265编码为H265格式&#xff0c;并存储到本地文件中 二、实现流程 准备文件 在build路径下准备yuv文件 在项目中添加文件参数&#xff0c;输出为h265文件&#xff0c;使用libx265编码 初始化解码器 通过传进来的libx265…

ECreator低代码平台-文件管理器的使用说明

Ecreator是中山华拓信息技术公司旗下的一款低代码平台&#xff0c;主要功能包含&#xff1a;文件管理器&#xff0c;表单数据管理器&#xff0c;仪表盘设计界面&#xff0c;内容页面自定义等功能&#xff0c;可以用于快速低成本的构建网站和企业内部应用。 下面介绍一下文件管…

高考加油!UI界面生成器!

这个高考助力标语生成器具有以下特点&#xff1a; 视觉设计&#xff1a;采用了蓝色为主色调&#xff0c;搭配渐变背景和圆形装饰元素&#xff0c;营造出宁静而充满希望的氛围&#xff0c;非常适合高考主题。 标语生成&#xff1a;内置了超过 100 条精心挑选的高考加油标语&a…

阿姆达尔定律的演进:古斯塔夫森定律

前言 在上一篇文章《使用阿姆达尔定律来提升效率》中提到的阿姆达尔定律前提是假设问题的规模保持不变&#xff0c;并且给定一台速度更快的机器&#xff0c;目标是更快地解决问题。然而&#xff0c;在大多数情况下&#xff0c;这并不完全正确。当有一台更快的机器时&#xff0…

【RabbitMQ】- Channel和Delivery Tag机制

在 RabbitMQ 的消费者代码中&#xff0c;Channel 和 tag 参数的存在是为了实现消息确认机制&#xff08;Acknowledgment&#xff09;和精细化的消息控制。 Channel 参数 作用 Channel 是 AMQP 协议的核心操作接口&#xff0c;通过它可以直接与 RabbitMQ 交互&#xff1a; 手…

核心机制:流量控制

搭配滑动窗口使用的 窗口大小 窗口越大,传输速度就越快,但是也不能无限大,太大了,对于可靠性会有影响 比如发生方以非常快的速度,发送,接收方的处理速度跟不上,也就会导致有效数据被接受方丢弃(又得重传) 流量控制,就是根据接收方的处理能力(如何衡量?),干预到发送方的发送…

深度强化学习赋能城市消防优化,中科院团队提出DRL新方法破解设施配置难题

在城市建设与发展中&#xff0c;地理空间优化至关重要。从工业园区选址&#xff0c;到公共服务设施布局&#xff0c;它都发挥着关键作用。但传统求解方法存在诸多局限&#xff0c;如今&#xff0c;深度学习技术为其带来了新的转机。 近日&#xff0c;在中国地理学会地理模型与…