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.rhkb.cn/news/197819.html

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

相关文章

UnitTest框架

目标: 1.掌握UnitTest框架的基本使用方法 2.掌握断言的使用方法 3.掌握如何实现参数化 4.掌握测试报告的生成 1.定义 (1)框架(framework):为解决一类事情的功能集合。(需要按照框架的规定(套路) 去书写代码&…

Ubuntu16.04上安装Docker

Ubuntu16.04上安装Docker 更新 apt 包索引: sudo apt-get update安装依赖包,以便使用 HTTPS 仓库 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common添加 Docker GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu…

JavaWeb——CSS3的使用

目录 1. CSS概述 2. CSS引入方式 3. CSS颜色显示 4. CSS选择器 4.1. 元素(标签)选择器 4.2. id选择器 4.3. 类选择器 4.4. 三者优先级 5. 盒子模型 1. CSS概述 CSS,全称为“Cascading Style Sheets”,中文译为“层叠样式…

影刀sqlite的插入方法

影刀sqlite的插入方法 变量外面不用加‘’

【开源】基于Vue.js的开放实验室管理系统的设计和实现

项目编号: S 013 ,文末获取源码。 \color{red}{项目编号:S013,文末获取源码。} 项目编号:S013,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

大语言模型的三阶段训练

为了训练专有领域模型,选择LLaMA2-7B作为基座模型,由于LLaMA模型中文词表有限,因此首先进行中文词表的扩展,然后进行三阶段训练(增量预训练,有监督微调,强化学习)。 代码将全部上传…

使用Redis实现分布式锁

Hi, I’m Shendi 使用Redis实现分布式锁 需求场景 需要使用到分布式锁的场景非常多,例如抢单等并发场景,这里举一个例子。 有一个商品,限量出售100个,一个用户下单,数量就减少一个,当剩下最后一个时&…

Verilog基础:仿真时x信号的产生和x信号对于各运算符的特性

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 信号爆x也许是所有IC人的噩梦,满屏的红色波形常让人头疼不已,但x信号的产生原因却常常只有几种,只要遵循一定的代码规范&#…

图像分类(五) 全面解读复现ResNet

解读 Abstract—摘要 翻译 更深的神经网络往往更难以训练,我们在此提出一个残差学习的框架,以减轻网络的训练负担,这是个比以往的网络要深的多的网络。我们明确地将层作为输入学习残差函数,而不是学习未知的函数。我们提供了非…

ubuntu中用docker部署jenkins,并和码云实现自动化部署

1.部署jenkins docker network create jenkins docker run --name jenkins-docker --rm --detach \--privileged --network jenkins --network-alias docker \--env DOCKER_TLS_CERTDIR/certs \--volume jenkins-docker-certs:/certs/client \--volume jenkins-data:/var/jen…

美国服务器:全面剖析其主要优点与潜在缺点

​  服务器是网站搭建的灵魂。信息化的今天,我们仍需要它来为网站和应用程序提供稳定的运行环境。而美国作为全球信息技术靠前的国家之一,其服务器市场备受关注。那么,美国服务器究竟有哪些主要优点和潜在缺点呢? 优点 数据中心基础设施&a…

三十分钟学会Hive

Hive的概念与运用 Hive 是一个构建在Hadoop 之上的数据分析工具(Hive 没有存储数据的能力,只有使用数据的能力),底层由 HDFS 来提供数据存储,可以将结构化的数据文件映射为一张数据库表,并且提供类似 SQL …

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

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

OpenCV C++ 图像处理实战 ——《OCR字符识别》

OpenCV C++ 图像处理实战 ——《OCR字符识别》 一、结果演示二、tesseract库配置2.1下载编译三、OCR字符识别3.1 文本检测方式3.1.1 RIL_BLOCK3.1.2 RIL_PARA3.1.3 RIL_TEXTLINE3.1.4 RIL_WORD3.1.5 RIL_SYMBOL3.2 英文文本检测3.3 中英文本检测四、源码测试图像下载总结一、结…

随机过程-张灏

文章目录 导论随机过程相关 学习视频来源:https://www.bilibili.com/video/BV18p4y1u7NP?p1&vd_source5e8340c2f2373cdec3870278aedd8ca4 将持续更新—— 第一次更新:2023-11-19 导论 教材:《随机过程及其应用》陆大絟.张颢 参考&…

BatchNormalization:解决神经网络中的内部协变量偏移问题

ICML2015 截至目前51172引 论文链接 代码连接(planing) 文章提出的问题 减少神经网络隐藏层中的”内部协变量偏移”问题。 在机器学习领域存在“协变量偏移”问题,问题的前提是我们划分数据集的时候,训练集和测试集往往假设是独立同分布(i.i.d)的,这种独立同分布更有利于…

数据资产到底如何入表?

2024年1月1日起,财政部《企业数据资源相关会计处理暂行规定》正式施行,距离现在只有一个多月的时间。 数据资源入表意味着企业可以将数据资源确认为企业资产负债表中“资产”一项。对于拥有丰富数据资源的企业来说,有望在财务报表中体现其真…

辅助解决小白遇到的电脑各种问题

写这个纯属是为了让电脑小白知道一些电脑上的简单操作,勿喷!!! 一:当小白遇到电脑程序不完全退出怎么办? 使用软件默认的退出方式 此处拿百度网盘举例: 用户登录网盘后: 如果直接点…

C_12练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) C 风格的注释,也称块注释或多行注释,以()…