Java多线程(3)
Java多线程(3)
深入剖析Java线程的生命周期,探秘JVM的线程状态!
线程的生命周期
Java 线程的生命周期主要包括五个阶段:新建、就绪、运行、阻塞和销毁。
- **新建(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 六种状态,**让我们一一来了解:
- **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关键字保证在修改库存数量时的线程安全性。
然后,我们创建一个订单处理线程,使用 Lock 和 Condition 来控制线程的阻塞和唤醒。
在主线程中,我们创建并启动这两个线程,并演示线程状态的变化。
在运行这段代码时,我们可以观察到以下线程状态的变化:
商品库存管理线程(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六种状态。**在实际项目中,了解线程的生命周期和状态对于编写高效的多线程程序非常重要。合理地管理和控制线程的状态转换,可以提高程序的并发性能和稳定性。
相关文章:

Java多线程(3)
Java多线程(3) 深入剖析Java线程的生命周期,探秘JVM的线程状态! 线程的生命周期 Java 线程的生命周期主要包括五个阶段:新建、就绪、运行、阻塞和销毁。 **新建(New):**线程对象通过 new 关键字创建&…...

Java线程周期
Java线程的生命周期包含以下状态: 新建(New):当一个线程被创建但还没有被启动时,它的状态是新建。就绪(Runnable):当线程已经被启动并且没有任何阻止它立即运行的条件时,…...

map与set的封装
目录 红黑树的结点 与 红黑树的迭代器 红黑树的实现: 迭代器: 编辑 红黑树的查找: 红黑树的插入: 编辑 检查红色结点:编辑红黑树的左旋 编辑红黑树的右旋 编辑红黑树的双旋 Map的封装 编辑set的…...

mac无法向移动硬盘拷贝文件怎么解决?不能读取移动硬盘文件怎么解决
有时候我们在使用mac的时候,会遇到一些问题,比如无法向移动硬盘拷贝文件或者不能读取移动硬盘文件。这些问题会给我们的工作和生活带来不便,所以我们需要找到原因和解决办法。本文将为你介绍mac无法向移动硬盘拷贝文件怎么回事,以…...

基于Netty实现的简单聊天服务组件
目录 基于Netty实现的简单聊天服务组件效果展示技术选型:功能分析聊天服务基础设施配置(基于Netty)定义组件基础的配置(ChatProperties)定义聊天服务类(ChatServer)定义聊天服务配置初始化类&am…...

视频封面:从视频中提取封面,轻松制作吸引人的视频
在当今的数字时代,视频已成为人们获取信息、娱乐和交流的重要方式。一个吸引人的视频封面往往能抓住眼球,提高点击率和观看率。今天将介绍如何从视频中提取封面,轻松制作吸引人的视频封面。 一、准备素材选择合适的视频片段 首先࿰…...

CICD 持续集成与持续交付——gitlab
部署 虚拟机最小需求:4G内存 4核cpu 下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装依赖性 [rootcicd1 ~]# yum install -y curl policycoreutils-python openssh-server perl[rootcicd1 ~]# yum install -y gitlab-ce-15.9.3-ce.0…...

Linux - 驱动开发 - RNG框架
说明 公司SOC上有一个新思的真随机数(TRNG)模块,Linux平台上需要提供接口给外部使用。早期方式是提供一个独立的TRNG驱动,实现比较简单的,但是使用方式不open,为了加入Linux生态环境,对接linux…...

qsort使用举例和qsort函数的模拟实现
qsort使用举例 qsort是C语言中的一个标准库函数,用于对数组或者其他数据结构中的元素进行排序。它的原型如下: void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 我们可以去官网搜来看一看:…...

AttributeError: module ‘gradio‘ has no attribute ‘ClearButton‘解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Kafka 集群如何实现数据同步?
哈喽大家好,我是咸鱼 最近这段时间比较忙,将近一周没更新文章,再不更新我那为数不多的粉丝量就要库库往下掉了 T﹏T 刚好最近在学 Kafka,于是决定写篇跟 Kafka 相关的文章(文中有不对的地方欢迎大家指出)…...

一本了解生成式人工智能
上周,发了一篇关于大语言模型图数据库技术相结合的文章,引起了很多朋友的兴趣。当然了,这项技术本身就让俺们很兴奋,比如我就是从事图研发的,当然会非常关注它在图领域的应用与相互促就啦。 纵观人类文明历史ÿ…...

git 相关指令总结(持续更新中......)
文章目录 一、git clone 相关指令1.1 clone 指定分支的代码 一、git clone 相关指令 1.1 clone 指定分支的代码 git clone -b 分支名 仓库地址...

windows 安装 Oracle Database 19c
目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation(甲骨文公司)开发和提供的一种关系型数据库管理系统,它是一种强大的关系型数据库管理系统…...

【数据结构】图的存储结构(邻接矩阵)
一.邻接矩阵 1.图的特点 任何两个顶点之间都可能存在边,无法通过存储位置表示这种任意的逻辑关系。 图无法采用顺序存储结构。 2.如何存储图? 将顶点与边分开存储。 3.邻接矩阵(数组表示法) 基本思想: 用一个一维数…...

kubernetes--Pod控制器详解
目录 一、Pod控制器及其功用: 二、pod控制器的多种类型: 1、ReplicaSet: 1.1 ReplicaSet主要三个组件组成: 2、Deployment: 3、DaemonSet: 4、StatefulSet: 5、Job: 6、Cronjob: …...

九、Linux用户管理
1.基本介绍 Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,让后以这个账号的身份进入系统 2.添加用户 基本语法 useradd 用户名 应用案例 案例1:添加一个用户 m…...

springboot项目中没有识别到yml文件解决办法
springboot项目中没有识别到yml文件解决办法 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传] 1、这个意思就是没有配置数据库的数据源路径。所以需要配置数据源,比如mysql的驱动和路径。检查是否在properties或者yml文件中是否已经配置好。…...

[管理与领导-125]:一个IT人的思考:职场中、人际交往中,不要为他人的不良行为和言语买单,不要让自己的情绪被外界影响或掌控。
目录 前言: 一、是什么What 二、为什么Why? 三、怎么办How? 前言: 无论是职场中,还是人际交往中,我们的难免受到他人的影响,有积极正面的情绪影响,有消极负面的情绪影响。为什么我们自身的情绪会受到…...

【FPGA】IP核
一.IP核是什么 IP:知识产权,半导体产业中:在ASIC和FPGA中定义为预先设计好的电路功能模块。 在使用的时候其他用户可以直接调用IP核心。 二. 为什么要是有IP核 提高开发效率,减小设计和调试的时间,加速开发进程&am…...

吾爱破解置顶的“太极”,太好用了吧!
日常工作和娱乐,都需要用到不同类型的软件,哪怕软件体积不大,也必须安装,否则到用时找不到就非常麻烦了。 其实,很多软件不一定一样不剩地全部安装一遍,一方面原因是用的不多,另一方面多少有点…...

Postman接收列表、数组参数@RequestParam List<String> ids
示例如下: 接口定义如下: GetMapping(value "/queryNewMoviePath")public List<Map<String, Object>> queryNewMoviePath(RequestParam List<String> ids ) {return service.queryNewMoviePath(ids);}postman中测试如下: http://loc…...

qemu + busybox + 内核实验环境搭建(2023-11)
主要是参考网上的例子,网上的一些例子可能用的busybox 老旧,编译各种问题,以及rootfs hda的方式或者ramfs的方式。可能有些概念还是不清楚,以下是最终完成测试成功的案例。 下载kernel https://cdn.kernel.org/pub/linux/kernel…...

JavaScript管理HTMLDOM元素(增删改查)
本文主要讲解JavaScript如何通过管理HTML上的DOM元素,其中包括如何查询、创建、修改以及删除具体功能和源码讲解。 增加 首先我们准备一个HTML框架和简单CSS样式,我对其中元素作用和关系进行一个简单说明。 <!DOCTYPE html> <html><he…...

RE2文本匹配实战
引言 今天我们来实现RE2进行文本匹配,模型实现参考了官方代码https://github.com/alibaba-edu/simple-effective-text-matching-pytorch。 模型实现 RE2模型架构如上图所示。它的输入是两个文本片段,所有组件参数除了预测层和对齐层外都是共享的。上图…...

实在智能携手中国电信翼支付,全球首款Agent智能体亮相2023数字科技生态大会
11月10日-13日,中国电信与广东省人民政府联合主办的“2023数字科技生态大会”在广州隆重举行。本届大会以“数字科技焕新启航”为主题,邀请众多生态合作伙伴全方位展示数字科技新成果,包括数字新消费、产业数字化、智能电子、人工智能大模型等…...

安全框架springSecurity+Jwt+Vue-1(vue环境搭建、动态路由、动态标签页)
一、安装vue环境,并新建Vue项目 ①:安装node.js 官网(https://nodejs.org/zh-cn/) 2.安装完成之后检查下版本信息: ②:创建vue项目 1.接下来,我们安装vue的环境 # 安装淘宝npm npm install -g cnpm --registryhttps:/…...

React整理总结(三)
1.props和state的更新 父组件重新render时,所有的子组件也会调用render()函数。shouldComponentUpdate(nextProp, nextState) shouldComponentUpdate(nextProps, nextState) {if (equal(nextProps, this.props) && equa…...

天气这么好,都外出了。顺便了解一下漏桶算法
看到标题,你想到了些什么呢? 又是一个阳光明媚的周末,大家都外出了,路上到处堵车,尤其是各桥梁、隧道入口处,很多车排队等着进入,而出口处就像一个漏桶一样,一辆车接着一辆车有序且…...

【FPGA】Verilog:实现 RS 触发器 | Flip-Flop | 使用 NOR 的 RS 触发器 | 使用 NAND 的 RS 触发器
目录 0x00 RS 触发器(RS Flip-Flop) 0x01 实现 RS 触发器 0x02 使用 NOR 的 RS 触发器 0x03 使用 NAND 的 RS 触发器 0x00 RS 触发器(RS Flip-Flop) 触发器(Flip-Flop)是一种带有时钟的二进制存储设备…...