线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式?
在 Java 中,线程的生命周期管理通过不同的状态来跟踪。一个线程在其生命周期中可以处于多种状态,不同的状态之间会通过特定的事件发生转变。以下是 Java 线程的几种状态及其之间的转移方式:
1. 线程的状态
1.1 NEW(新建状态)
- 定义:线程刚被创建,但尚未启动。
- 状态表示:当通过
new Thread()
创建一个线程对象时,它处于 NEW 状态。
1.2 RUNNABLE(可运行状态)
- 定义:线程已经调用了
start()
方法,处于可运行状态。此时,线程可能正在执行,也可能因为其他线程在运行而处于就绪状态(等待 CPU 时间片)。 - 状态转换:
- 从 NEW 转变为 RUNNABLE:通过调用
start()
方法启动线程。
- 从 NEW 转变为 RUNNABLE:通过调用
1.3 BLOCKED(阻塞状态)
- 定义:线程在等待获取一个锁对象(通常是同步方法或代码块的锁),并且因此无法继续执行。
- 状态转换:
- 从 RUNNABLE 转变为 BLOCKED:当线程尝试获取一个已经被其他线程持有的锁时。
1.4 WAITING(等待状态)
- 定义:线程在等待另一个线程执行特定操作。进入此状态的线程不会消耗 CPU 资源。
- 状态转换:
- 从 RUNNABLE 转变为 WAITING:
- 调用
Object.wait()
。 - 调用
Thread.join()
。 - 调用
LockSupport.park()
。
- 调用
- 从 RUNNABLE 转变为 WAITING:
1.5 TIMED_WAITING(限时等待状态)
- 定义:线程在等待某个操作,在达到指定的时间后自动唤醒。
- 状态转换:
- 从 RUNNABLE 转变为 TIMED_WAITING:
- 调用
Thread.sleep(milliseconds)
。 - 调用
Object.wait(milliseconds)
。 - 调用
Thread.join(milliseconds)
。 - 调用
LockSupport.parkNanos()
或LockSupport.parkUntil()
。
- 调用
- 从 RUNNABLE 转变为 TIMED_WAITING:
1.6 TERMINATED(终止状态)
- 定义:线程已完成执行或异常退出。
- 状态转换:
- 从 RUNNABLE 或 BLOCKED、WAITING、TIMED_WAITING 转变为 TERMINATED:当
run()
方法的执行结束,或者发生未捕获异常。
- 从 RUNNABLE 或 BLOCKED、WAITING、TIMED_WAITING 转变为 TERMINATED:当
2. 状态转换总结
起始状态 | 事件 | 目标状态 |
---|---|---|
NEW | 调用 start() | RUNNABLE |
RUNNABLE | 获得 CPU 的运行时间 | RUNNABLE |
RUNNABLE | 线程调用 sleep() /wait() | WAITING |
RUNNABLE | 线程调用 join() | WAITING |
RUNNABLE | 获取不到锁 | BLOCKED |
RUNNABLE | 调用 sleep(milliseconds) | TIMED_WAITING |
WAITING | 被其他线程调用 notify() /notifyAll() | RUNNABLE |
TIMED_WAITING | 超过时间 | RUNNABLE |
TERMINATED | 线程完成执行 | TERMINATED |
3. 线程状态的实现
通过 Java 的 Thread
类和实现 Runnable
接口的类,可以更好地理解线程状态的转换,对开发中的多线程应用程序实现和管理至关重要。
总结
Java 线程的几种状态以及它们之间的转换方式为程序员在进行多线程编程时提供了清晰的参考。理解这些状态有助于更好地设计和调试多线程应用程序。如果你有其它问题或需要更详细的解释,请随时在评论区留言探讨!
相关文章:
线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式?
在 Java 中,线程的生命周期管理通过不同的状态来跟踪。一个线程在其生命周期中可以处于多种状态,不同的状态之间会通过特定的事件发生转变。以下是 Java 线程的几种状态及其之间的转移方式: 1. 线程的状态 1.1 NEW(新建状态&…...
自注意力机制self-attention中的KV 缓存
在自注意力机制中,KV 缓存(Key-Value Caching)主要用于加速模型在推理阶段的计算,尤其是在处理长序列或者生成任务(如文本生成)时,这种缓存机制可以显著提高效率。 1. KV 缓存的背景 在 Trans…...
前端库--nanoid(轻量级的uuid)
文章目录 定义:生成方式:现实使用:NanoID 只有 108 个字节那么大NanoID更安全NanoID它既快速又紧凑 使用步骤1.安装nanoid包2.引入使用3.使用4.自定义字母 定义: UUID 是 通用唯一识别码(Universally Unique Identifierÿ…...
计算机基础-什么是网络端口?
网络端口可以想象成一个大型公寓楼的邮箱。每个公寓楼(这里指的是一个计算机或服务器)有很多个邮箱(即网络端口),每个邮箱都有一个独一无二的编号(端口号)。当一封信(网络数据包&…...

力扣动态规划基础版(斐波那契类型)
70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 70.爬楼梯 方法一 动态规划 考虑转移方程和边界条件: f(x) f(x -1) f(x - 2);f(1) 1;f&…...

Java重修笔记 InetAddress 类和 Socket 类
InetAddress 类相关方法 1. 获取本机 InetAddress 对象:getLocalHost public static InetAddress getLocalHost() throws UnknownHostException 返回值:本地主机的名字和地址 异常:UnknownHostException - 如果本地主机名无法解析成地址 2…...

秋招突击——8/6——万得数据面试总结
文章目录 引言正文面经整理一1、讲一下java的多态,重载,重写的概念,区别2、说一下Java的数组,链表的结构,优缺点3、创建java线程的方式有哪些,具体说说4、创建线程池呢、每个参数的意义5、通过那几种方式保…...

STM32定时器
目录 STM32定时器概述 STM32基本定时器 基本定时器的功能 STM32基本定时器的寄存器 STM32通用定时器 STM32定时器HAL库函数 STM32定时器概述 从本质上讲定时器就是“数字电路”课程中学过的计数器(Counter),它像“闹钟”一样忠实地为处…...
第七课 Vue中的v-for遍历指令
Vue中的v-for遍历指令 v-for用于对象遍历(数组/JSON),渲染数据列表 基础示例: <div id"app"><ul><li v-for"val in arr">{{val}}</li></ul></div><script>new V…...

【NTN 卫星通信】卫星通信的专利
1 概述 好久没有看书了,最近买了本讲低轨卫星专利的书,也可以说是一个分析报告。推荐给喜欢的朋友。 2 书籍截图 图1 封面 图2 波音低轨卫星专利演进 图3 低轨卫星关键技术专利发展阶段 图4 第一页 3 参考文献 产业专利分析报告–低轨卫星通信技术...
vue3 element table 插槽外的数据更新,插槽内的数据未更新。
在使用element table组件时候,有时候需要对table内部的header插槽进行单独的列的数据操作,比如在列头增加一个筛选功能,对指定范围的值进行一个筛选,需要对input的值进行v-model的绑定,对绑定的值进行清空时候…...

飞凌嵌入式FET527N-C核心板已适配OpenHarmony4.1
近期,飞凌嵌入式为FET527N-C核心板适配了OpenHarmony4.1系统——进一步提升了核心板的兼容性、稳定性和安全性。 OpenHarmony4.1在应用开发方面展现了全新的开放能力,以更加清晰的逻辑和场景化视角提供给开发者丰富的API接口,应用开发能力得…...

CVPR 2024最佳论文候选-pixelSplat论文解读
目录 一、概述 二、相关工作 1、单场景下的视角合成 2、基于先验的三维重建和视图合成 3、多视图几何测量 三、3DGS的缺点 1、容易陷入最小值 2、需要大量输入图像 3、尺度模糊性 四、pixelSplat 1、解决尺度模糊性(深度信息生成) 2、编码器…...
在Android中如何切割一张图片中的不规则“消息体/图片/表情包等等”?
在Android应用中,判断一张图片中“消息体”的大小,可以通过图像处理技术来实现。主要的步骤包括:将图像转换为灰度图,进行二值化处理,接着使用轮廓检测或边缘检测来识别消息体的边界,最后计算消息体的大小。…...

Jenkins+Ant+Jmeter接口自动化集成测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、Jenkins安装配置 1、安装配置JDK1.6环境变量; 2、下载jenkins.war,放入C:\jenkins目录下,目录位置随意; J…...

JavaSE——集合4:List接口实现类—LinkedList
目录 一、LinkedList的全面说明 二、LinkedList的底层操作机制 (一)LinkedList添加结点源码 (二)LinkedList删除结点源码 三、LinkedList常用方法 四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…...

FPGA图像处理之三行缓存
文章目录 一、前言二、FPGA实现三行缓存的架构三、Verilog代码实现四、仿真验证五、输入图像数据进行仿真验证 一、前言 在 FPGA 做图像处理时,行缓存是一个非常重要的一个步骤,因为图像输入还有输出都是一行一行进行的,即处理完一行后再处理…...
10月15日,每日信息差
第一、《哈利・波特与魔法石》在中国内地总票房突破 3 亿元,包括 2002 年首映的 5600 万,2020 年重映的 1.923 亿,以及 2024 年重映的 5170 万。 第二、全国铁路实施新货物列车运行图,增开城际班列至 131 列,多式联运…...
4G、5G通信中,“网络侧“含义
在5G通信中,"网络侧"这个术语可以指代不同的网络元素,具体取决于上下文。通常,网络侧可以包括以下两个主要部分: 基站(gNB): 基站是无线接入网(RAN)的一部分&a…...
spring boot核心理解-各种starter
理解 Spring Boot 的 Starter 机制以及如何选择和使用各种 starter,是开发 Spring Boot 应用的重要一环。Spring Boot Starter 是一组方便的依赖组合,用于简化 Spring 项目中的依赖管理。它们可以帮助开发者快速引入所需的库和自动配置,从而加…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...