Java多线程(3)

news2024/9/25 19:23:08

Java多线程(3)

深入剖析Java线程的生命周期,探秘JVM的线程状态!

img

线程的生命周期

Java 线程的生命周期主要包括五个阶段:新建、就绪、运行、阻塞和销毁。

img

  • **新建(New):**线程对象通过 new 关键字创建,但还未调用 start() 方法时,线程处于新建状态。此时,线程对象已经分配了内存空间,但尚未启动执行。
  • **就绪(Runnable):**线程对象调用 start() 方法后,线程处于就绪状态。此时,线程已经准备好执行,但还没有获得 CPU 时间片。多个线程处于就绪状态时,由 Java 虚拟机的线程调度器来决定哪个线程获得 CPU 时间片开始执行。
  • **运行(Running):**当线程获得 CPU 时间片开始执行时,线程处于运行状态。此时,线程的 run() 方法正在被执行。
  • **阻塞(Blocked):**在特定情况下,线程可能会被暂时挂起,进入阻塞状态。例如,线程调用了 sleep() 方法、等待 I/O 操作、获得了某个对象的锁但没有获取到锁等。当阻塞状态的条件解除时,线程会重新进入就绪状态,等待获取 CPU 时间片继续执行。
  • **销毁(Terminated):**线程执行完 run() 方法后,或者调用了 stop() 方法,线程将进入销毁状态。一旦线程进入了销毁状态,就无法再恢复到其他状态。

Java 线程状态的分析

**在 Java 虚拟机(JVM)中,线程的状态主要分为 new、runnable、blocked、waiting、timed_waiting和terminated 六种状态,**让我们一一来了解:

img

  • **new:**当我们创建一个线程对象时,线程就处于 new状态。此时,线程对象已经被创建,但还没有开始执行。
  • **runnable:**当线程调用 start() 方法后,线程就进入了runnable状态。此时,线程已经准备好执行,但还没有获得 CPU 的执行时间片,处于等待 CPU 调度的状态。
  • **blocked:**在线程执行过程中,可能会因为等待锁资源而暂时无法继续执行,此时线程就进入了 blocked状态。例如,在多线程并发访问共享资源时,如果一个线程已经持有了某个对象的锁,其他线程就无法获取该锁,进而被阻塞。
  • **waiting:**在某些情况下,线程可能会主动调用 wait()方法,进入 waiting 状态。例如,线程等待某个条件的满足,或者等待其他线程的通知。在 waiting 状态下,线程会被挂起,直到被其他线程唤醒。
  • **timed_waiting:**类似于waiting状态,但是在timed_waiting 状态下,线程会在一定的时间内等待。例如,线程调用了 sleep() 方法、join() 方法或者等待某个锁的过程中,会进入 timed_waiting 状态。一旦等待时间到达或者锁被释放,线程会重新进入runnable 状态。
  • **terminated:**线程的任务执行完毕,或者出现异常导致线程终止,线程就进入了 terminated 状态。一旦线程进入 terminated 状态,就无法再被启动和执行。

实际案例演示

为了更好地理解 Java 线程的生命周期,让我们来看一个实际的电商项目案例,通过简单的 Java 代码演示不同线程状态的变化。

假设我们有一个电商项目,其中包含了商品库存管理和订单处理两个模块。商品库存管理模块负责更新商品库存数量,而订单处理模块负责处理用户提交的订单。

在这个案例中,我们可以创建两个线程,分别模拟商品库存管理和订单处理两个模块的并发执行。

首先,我们创建一个商品库存管理线程,使用 synchronized关键字保证在修改库存数量时的线程安全性。

img

然后,我们创建一个订单处理线程,使用 Lock 和 Condition 来控制线程的阻塞和唤醒。

img

在主线程中,我们创建并启动这两个线程,并演示线程状态的变化。

img

在运行这段代码时,我们可以观察到以下线程状态的变化:

商品库存管理线程(InventoryManagementThread)的线程状态:

  • **new:**在调用 start() 方法创建线程对象后,线程进入new状态,表示线程对象已经被创建但尚未启动。
  • **runnable:**在调用 start() 方法后,线程开始运行并进入 runnable 状态,表示线程处于可运行状态,但不一定正在执行。在这个案例中,我们可以看到线程在运行时通过输出语句显示了商品库存数量的变化,处于 runnable 状态。
  • **terminated:**当线程执行完 run() 方法中的代码或者调用了 stop() 方法后,线程进入 terminated 状态,表示线程执行完毕并终止。

订单处理线程(OrderProcessingThread)的线程状态:

  • **new:**在调用 start() 方法创建线程对象后,线程进入new 状态,表示线程对象已经被创建但尚未启动。
  • **runnable:**在调用 start() 方法后,线程开始运行并进入 runnable 状态,表示线程处于可运行状态,但不一定正在执行。在这个案例中,订单处理线程在订单未提交时通过调用 condition.await() 方法进入了阻塞状态,处于 runnable 状态。
  • **blocked:**在订单未提交时,订单处理线程通过调用condition.await() 方法进入了阻塞状态,表示线程因为等待某个条件而被阻塞,处于 blocked 状态。
  • **runnable:**当订单提交后,订单处理线程通过调用condition.signal() 方法被唤醒并继续执行,进入runnable 状态。
  • **terminated:**当线程执行完 run() 方法中的代码或者调用了 stop() 方法后,线程进入 terminated 状态,表示线程执行完毕并终止。

通过以上案例,我们可以清楚地看到不同线程状态的转换,包括 new、runnable、blocked、terminated 等状态。

总结

ated 状态,表示线程执行完毕并终止。

通过以上案例,我们可以清楚地看到不同线程状态的转换,包括 new、runnable、blocked、terminated 等状态。

总结

**Java线程的生命周期包括新建、就绪、运行、阻塞和销毁五个阶段。根据JVM的源码分析,线程的状态可以分为new、runnable、blocked、waiting、timed_waiting和terminated六种状态。**在实际项目中,了解线程的生命周期和状态对于编写高效的多线程程序非常重要。合理地管理和控制线程的状态转换,可以提高程序的并发性能和稳定性。

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

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

相关文章

Network(五)数值介绍与子网划分

一 数值 1 数值介绍 (1)带宽 在一定时间内通过某一网络连接的信息量 基本单位:比特每秒 (bit/s) 在计算机软件方面用字节每秒为单位 (2)存储量 计算机存储量可以用位和字节计量 (3)常用…

【Linux】-进程间通信-命名管道文件(没有关系的进程间进行通信),以及写一个日志模板

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

【设计模式】聊聊模板模式

原理和实现 设计模式的原理和实现是比较简单的,难的是掌握具体的应用场景和解决什么问题。而模板模式是为来解决复用和拓展两个问题。 模板模式在一个方法中定义好一个算法框架,然后将某些步骤推迟到子类中实现,子类可以在不修改父类流程的时…

【C++】泛型编程 ⑦ ( 模板类常用用法 | 模板类声明 | 模板类调用 | 模板类作为函数参数 )

文章目录 一、类模板基础用法1、类模板声明定义2、类模板使用3、类模板做函数参数 二、完整代码示例1、代码示例2、执行结果 一、类模板基础用法 1、类模板声明定义 上一篇博客中 , 【C】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 ) 讲解了模板类的基础语法 , 模板类声明如…

DrugMAP: molecular atlas and pharma-information of all drugs学习

DrugMAP:所有药物的分子图谱和制药信息 - PMC (nih.gov) DrugMAP: the molecular atlas and pharma-information of drugs (idrblab.net) 构建了一个描述药物分子图谱和药物信息的新数据库(DrugMAP)。它提供了>30 000种药物/候选药物的相…

安装Nginx时报:./configure: error: can not define uint32_t

安装版本:v.1.25.3 安装命令: ./configure --prefix/opt/nginx/1.25.3 && make && make install 执行命令后出现异常,如图: 解决方法: yum install -y kernel-headers kernel-devel gcc make

闭眼检测实现

引言 这段代码是一个实时眼睛状态监测程序,可以用于监测摄像头捕获的人脸图像中的眼睛状态,判断眼睛是否闭合。具体应用实现作用说明如下: 1. 实时监测眼睛状态 通过摄像头捕获的实时视频流,检测人脸关键点并计算眼睛的 EAR&a…

【C++】基础语法(中)

C基础语法(中) 文章目录 C基础语法(中)01数组一维数组数组初始化注意访问练习1练习2练习3普通做法:优化reverse函数练习4 多维数组清空数组memsetmemcpy 数组的部分由上到下,按规律 蛇形矩阵技巧 02 字符串…

UE 视差材质 学习笔记

视差材质节点: 第一个是高度图, Heightmap Channel就是高度图的灰色通道,在RGBA哪个上面,例如在R上就连接(1,0,0,0),G上就连接(0,1,0,0)逐次类推 去看看对比效果: 这个是有视差效果…

【心得】PHP文件包含基本利用个人笔记

本文可能比较凌乱,快速总结保证自己看得懂(真.个人笔记) 文件包含的本质:代码复用、并行开发、模块化、增加移植性 include和eval的区别: include和eval一样,都不是函数,都是语言结构&#xf…

2024全网最新最全的Pytest接口自动化测试框架教程

pytest编写的规则: 1、测试文件以test_开头(以_test结尾也可以) 2、测试类以Test开头,并且不能带有__init__方法 3、测试函数以test_开头 4、断言必须使用assert pytest.main([-s,-v]) :用来执行测试用例 -s 打印prin…

CnosDB有主复制演进历程

分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程,分享如何将分布式理论应用于实际生产,以及不同实现方式的优缺点和应用场景。 分布式系统架构模式 分布式存储系统下按照数据复…

Mybatis-Plus《学习笔记 22版尚硅谷 》——感谢【尚硅谷】官方文档

Mybatis-Plus《学习笔记 22版尚硅谷 》 一、MyBatis-Plus1.简介2.特性3.支持数据库4.框架结构5.官方地址 二、入门案例1.开发环境2.建库建表3.创建工程4.配置编码5.测试查询 三、增删改查1.BaseMapper<T>2.调用Mapper层实现CRUD2.1 插入2.2 删除a、根据ID删除数据b、根据…

MySQL InnoDB 引擎底层解析(一)

6. InnoDB 引擎底层解析 MySQL 对于我们来说还是一个黑盒&#xff0c;我们只负责使用客户端发送请求并等待服务器返回结果&#xff0c;表中的数据到底存到了哪里&#xff1f;以什么格式存放的&#xff1f;MySQL 是以什么方式来访问的这些数据&#xff1f;这些问题我们统统不知…

Web安全研究(五)

Automated WebAssembly Function Purpose Identification With Semantics-Aware Analysis WWW23 文章结构 introbackgroundsystem design abstraction genapplying abstractionsclassifier data collection and handling data acquisitionstatistics of collected datamodule-…

Python---return返回值

return返回值 返回值&#xff1a;很多函数在执行完毕后&#xff0c;会通过return关键字返回一个结果给 调用它的位置。 return 英 /rɪˈtɜːn/ n. 回来&#xff0c;返回&#xff1b; 思考&#xff1a;如果一个函数需要两个return (如下所示)&#xff0c;程序如何执行&…

【数据结构(二)】单链表(3)

文章目录 1. 链表介绍2. 单链表应用实例2.1. 顺序添加方式2.1.1. 思路分析2.1.2. 代码实现 2.2. 按照编号顺序添加方式2.2.1. 思路分析2.2.2. 代码实现 3. 单链表节点的修改3.1. 思路分析3.2. 代码实现 4. 单链表节点的删除4.1. 思路分析4.2. 代码实现 5. 单链表常见面试题5.1.…

基于灰狼算法(GWO)优化的VMD参数(GWO-VMD)

代码的使用说明 基于灰狼算法优化的VMD参数 代码的原理 基于灰狼算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;优化的VMD参数&#xff08;GWO-VMD&#xff09;是一种结合了GWO和VMD算法的优化方法&#xff0c;用于信号分解和特征提取。 GWO是一种基于群体智能的优化…

数据结构:红黑树讲解(C++)

红黑树 1.前言2.红黑树简述2.1概念2.2性质 3.红黑树的插入3.1关于新插入节点的颜色3.2节点的定义3.3插入新节点3.4判断插入后是否需要调整3.5插入后维持红黑树结构&#xff08;重点&#xff09;3.5.1cur、p、u为红&#xff0c;g为黑3.5.2cur、p为红&#xff0c;g为黑&#xff0…