Java多线程(3)

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.hqwc.cn/news/195203.html

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

相关文章

SPASS-聚类和判别分析

聚类与判别分析概述 基本概念 聚类分析 聚类分析的基本思想是找出一些能够度量样本或指标之间相似程度的统计量,以这些统计量为划分类型的依据,把一些相似程度较大的样本(或指标)聚合为一类,把另外一些彼此之间相似程度较大的样本又聚合为一类。根据分类对象的不同,聚类…

Jenkins测完通知到人很麻烦?一个设置配置钉钉消息提醒!

Jenkins 作为最流行的开源持续集成平台,其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。但其实 Jenkins 还可以支持钉钉消息通知,其主要通过 DingTa…

高效管理文件:如何通过文件数量归类提高工作效率

在日常生活和工作中,需要处理大量的文件和资料。然而,如果这些文件没有得到妥善的管理,就会使得我们花费大量的时间和精力去寻找和整理它们。对于大量文件,按照数量归类可以使得文件管理更加有序和规范。根据文件的数量建立相应的…

算法设计与分析复习--贪心(二)

文章目录 上一篇哈夫曼编码单源最短路最小生成树Kruskal算法Prim算法 多机调度问题下一篇 上一篇 算法设计与分析复习–贪心&#xff08;一&#xff09; 哈夫曼编码 产生这种前缀码的方式称为哈夫曼树 哈夫曼树相关习题AcWing 148. 合并果子 #include <iostream> #inc…

三层交换机实现不同VLAN间通讯

默认时&#xff0c;同一个VLAN中的主机才能彼此通信&#xff0c;那么交换机上的VLAN用户之间如何通信&#xff1f; 要实现VLAN之间用户的通信&#xff0c;就必须借助路由器或三层交换机来完成。 下面以三层交换机为例子说明&#xff1a; 注意&#xff1a; 1.交换机与三层交换…

CnosDB有主复制演进历程

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

C语言 字符函数汇总,模拟实现各字符函数(炒鸡详细)

目录 求字符串长度 strlen 示例 模拟实现strlen 长度不受限制的字符串函数 strcpy 示例 模拟实现strcpy strcat 模拟实现strcat strcmp 示例 模拟实现strcmp 长度受限制的字符串函数介绍 strncpy 示例 模拟实现strncpy strncat 示例 模拟实现strncat s…

【【VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 】】

VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 LCD 的构造是在两片平行的玻璃基板当中放置液晶盒&#xff0c;下基板玻璃上设置 TFT&#xff08;薄膜晶体管&#xff09;&#xff0c;上基板玻璃上设置彩色滤光片&#xff0c;通…

ChatGPT最强?文心一言与ChatGPT对比

对于同一个问题我们分别对文心一言3.5和ChatGPT3.5输出回答&#xff0c;结果如下图&#xff0c;可以看到文心一言的回答更好&#xff0c;文心一言是由百度开发的人工智能语言模型&#xff0c;它的中文理解能力主要是基于百度强大的搜索引擎和自然语言处理技术。文心一言更加注重…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(二)

文章目录 第三章 识别CAN中的隐藏带宽信道3.1 隐蔽带宽vs.隐藏带宽3.1.1 隐蔽通道3.1.2 隐藏带宽通道 3.2 通道属性3.3 CAN隐藏带宽信道3.3.1 CAN帧ID字段3.3.2 CAN帧数据字段3.3.3 帧错误检测领域3.3.4 时间通道3.3.5 混合通道 3.4 构建信道带宽公式3.5通道矩阵3.6 结论 第四章…

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

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

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…