java线程状态流转

JVM线程分析详解 【代码】JVM线程分析详解。 阅读详情

本文主要分析jvm中涉及的线程状态以及这些状态的流转关系


wait和notify方法的执行前提是调用该方法的线程必须拿到该对象的监视器锁
1、wait和notify时当前线程必须拥有这个对象的监视器,synchronized (obj)
2、调用wait方法,将会把当前线程放入该对象的监视器锁等待集中
3、wait和wait(long)一旦调用就会立即释放监视器锁,尽管是wait(long)也不会在wait结束后才释放,也是一开始就释放
4、虚假唤醒问题。线程也可以在没有通知、中断或超时的情况下唤醒,即所谓的虚假唤醒。
如果条件不满足,则继续等待。换句话说,等待应该总是出现在循环中
5、notify方法唤醒没有顺序
6、notify和notifyAll方法调用后,不会立即释放锁,也就意味着不会立即唤醒某个或全部线程,而是等当前线程释放锁后,这一点和wait方法相反
7、wait和sleep的异同:
两者都会让出cpu时间片,线程处于waiting状态
前者是Object的final方法,后者是Thread的静态本地方法
在同步语句中,wait方法会立即释放锁进入waiting状态;而sleep不会释放锁


一、jvm线程状态总览

点开Thread类中的内部枚举类Thread#State可以见注释,jvm中的线程状态主要分为以下六种:
在这里插入图片描述

	NEW				(还没有启动的线程)
	RUNNABLE		(在jvm中执行)
	BLOCKED			(被阻塞,等待获取监视器锁)
	WAITTING		(无限期地等待另一个线程执行特定操作,如notify)
	TIMED_WAITTING	(等待另一个线程执行操作长达指定等待时间)
	TERMINATED		(已退出)

一个线程在同一时刻有且只能有一种状态,该状态属于jvm虚拟机范畴内的状态,不反映任何操作系统层面的线程状态。

二、状态流转

这6中线程状态中,我们主要关注以下三种状态:BLOCKED、WAITTING、TIMED_WAITTING。
在这里插入图片描述

BLOCKED

等待锁的时候会被阻塞,获取到锁后变为RUNNABLE状态

WAITTING

当线程调用wait方法、join方法以及park方法后进入挂起状态,相应的调用notify方法以及unpark方法后恢复为RUNNABLE状态。

TIMED_WAITTING

与WAITTING状态基本一致,区别在于挂起的状态有超时时间。

需要注意,RUNNABLE状态实际细分为ready和running状态,线程刚start时不会直接获取到cpu的时间片执行任务,而是处于就绪状态(ready)被统一放入就绪队列中,等待着jvm的线程调度器进行调度,只有真正被调度起来才是running状态

三、wait-notify的正确搭配使用方式

还是参考Object类的源码:

wait方法:
在这里插入图片描述

notify方法:
在这里插入图片描述

可见,wait和notify方法的执行前提是调用该方法的线程必须拿到该对象的监视器锁,否则必定会抛出IllegalMonitorStateException异常,这是jvm的规定。

那么wait和notify方法配合使用的正确打开方式如下:

public class TestThreadState {
    public static void main(String[] args) throws InterruptedException {

        final long SLEEP = 1L;
        final Object lock = new Object();

        new Thread(() -> {
            long start = System.currentTimeMillis();
            synchronized (lock) {
                try {
                    System.out.println("线程1获取到锁");
                    TimeUnit.SECONDS.sleep(SLEEP);
                    System.out.println("线程1即将调用wait方法,挂起当前线程并释放锁");
                    // 执行wait方法,挂起当前线程并释放锁
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程1执行耗时:" + (System.currentTimeMillis() - start));
        }).start();

        // 让线程1获取到时间片获取到监视器锁(注意这里和线程1睡眠保持了一致)
        TimeUnit.SECONDS.sleep(SLEEP);

        new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("线程2获取到锁");
                    TimeUnit.SECONDS.sleep(3);
                    lock.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

执行结果打印:

线程1获取到锁
线程1即将调用wait方法,挂起当前线程并释放锁
线程2获取到锁
线程1执行耗时:4015

执行代码可以看到流程为:
1、线程1调用wait方法使得当前线程挂起并释放监视器锁
2、线程2这时候获取到锁,进入同步块执行业务,结束后调用notify方法唤醒其他线程并退出同步块,释放监视器锁。
3、线程1恢复到RUNNABLE状态


Java并发之线程(二)-线程状态流转 线程状态流转 通用的线程状态流转(参考极客时间-王宝令《Java并发编程实战》-09 | Java线程(上):Java线程的生命周期) Java线程状态流转(参考《Java并发编程的艺术》), Java的线程状态做了细化,将五态模型中的休眠状态细化变成了 WAIT(等待) TIMED_WAITING(超时等待) BLOCKED(阻塞) 线程状态的定义参考Java源代码Threa... 阅读详情

相关推荐

实战并发编程 - 06线程在执行过程中的状态是如何流转的

文章目录线程的生命周期 线程的生命周期 java.lang.Thread中 线程状态State枚举

小工匠 3万+

小白必备线程状态描述详解

线程状态描述图 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。 3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。 4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。 阻

weixin_44835937的博客 422

智能化状态管理:自动状态流转处理模块

自动流转一般都是一个很大的处理系统,其中包含的处理内容是很庞大的,就这样一个大型系统的开发思路,我后面会抽空来分享一篇全局的思路,本次仅针对一般如果我们需要对一些业务流程需要进行自动化处理思维的给出一个样例的自动状态流转处理模块的代码示例。如果有写的不对的地方,请留言指正!

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

java并发-线程状态流转及基本使用

如果只想中断 Executor 中的一个线程,可以通过使用 submit() 方法来提交一个线程,它会返回一个 Future

埃泽漫笔 1030

RabbitMQ的使用(JAVA)

Java快速上手的MQ上线!

.............. 1万+

cordic算法的FPGA实现

cordic 算法的MATLAB仿真及verilog实现

qq_38360574的博客 1675

java中的线程状态流转

java中的线程状态。在Thread类中有一个State的枚举类,表示当前线程所处的状态。 线程状态一共有6种: 新建状态 (New)线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。 就绪状态 (Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,threa...

memory 520

ORB-SLAM3单目摄像头

home/wheeltec-client/workspace/src/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅话题(usb_cam/imahe_raw)即相机设置文件,官方提供的是Asus.yaml,可以另复制命名一个文件My_camera.yaml,将里面的相机参数修改成自己标定过的参数。sudoaptinstalllibeieng3-dev#命令安装的版本是eigen。

疯狂的石头 742

Java 线程状态流转图

笔者最近在阅读《Java并发编程实战》一书,多线程的基本运行单位就是线程,而线程的状态是如何流转的呢,在阅读了Thread的部分源代码过后,画出以下状态流转图强化记忆~ ...

qq_32734365的博客 2188

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献:《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心。

圆桌骑士的博客 7313

开源收银系统_大型收银系统源码_OctShop

开源收银系统正成为大型连锁企业数字化转型的关键工具。相比传统闭源系统,开源方案具有成本低(年均降本60%+)、定制灵活(支持多业态协同)、自主可控等优势,能有效解决高并发、多门店数据同步等痛点。核心价值在于:1)分布式架构适配规模化扩张;2)模块化设计实现个性化开发;3)开放接口打通ERP/CRM等系统。典型案例显示,连锁商超通过源码二次开发实现库存实时同步,补货效率提升50%;餐饮集团统一多业态收银流程后会员复购率增长35%。选型需关注源码成熟度、技术兼容性和安全合规,建议采用"开源+服务商&q

OctShop全栈工程师 938

谈谈你对Java线程5种状态流转原理的理解?

回答线程流转原理这个问题之前,我们先来回忆一下JDK中3种自定义线程的方式以及它们的优缺点。第1种:是继承Thread类。如代码所示:}}这种方式的优点是:实现简单,只需实例化继承类的实例,即可使用线程。它的缺点是:扩展性不足,Java是单继承的语言,如果一个类已经继承了其他类,就无法通过这种方式实现自定义线程第2种:是实现 Runnable 接口,如代码所示:}}它的优点是:扩展性好,可以在此基础上继承其他类,非常适合多线程处理一份资源的场景它的缺点是:构造线程实例的过程相对繁琐一点。...

Tom弹架构 622

一套C#接口通吃安川/发那科/库卡:工业机器人统一控制框架设计与产线踩坑实录

我们把机器人的通用能力抽象为接口,涵盖连接、运动、IO、寄存器、状态、报警六大类能力,所有品牌适配器都必须实现这个接口。/// 工业机器人统一控制接口// 基础连接// 运动控制// IO与寄存器// 状态与报警// 事件工业机器人统一控制框架的本质,不是把所有品牌的功能都做平,而是找到通用能力的最大公约数,通过分层抽象把品牌差异隔离在底层。上层业务只关注工艺和流程,不需要关心机器人是什么品牌、用什么SDK、通信协议是什么。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 402

java流转图片_Java 线程状态流转图

一.线程状态流转图Java的线程可以有多种状态,在Thread.State类中定义了6个常量来表示线程的状态,分别是NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,下面是比较详细的一幅状态流转图:二.示例代码2.1 sleep先看下面一段代码,测试sleep的时候是否会释放已经获取到的资源:package cn.ganlixin.thre...

weixin_35011928的博客 543

DeepLabv3+改进专栏

🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。

AIcurator的博客 2576

FastGPT智能体开发:FastGPT OpenAPI 知识库接口

FastGPT OpenAPI 知识库接口

王国平的博客 323

java多状态流转如何设计_Java 并发编程 ② - 线程生命周期与状态流转

前言往期文章:继上一篇结尾讲的,这一篇文章主要是讲线程的生命周期以及状态流转。主要内容有:Java 中对线程状态的定义,与操作系统线程状态的对比线程状态的流转图如何自己验证状态的流转一、Java 线程的状态先来谈一谈Java 中线程的状态。在 java.lang.Thread.State 类是 Thread的内部枚举类,在里面定义了Java 线程的六个状态,-注释信息也非常的详细。public e...

weixin_29377233的博客 677

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Java多线程】生命周期,线程状态,状态流转

抢占式调度模型:系统按照线程优先级分配CPU时间片。优先级高的线程优先分配CPU时间片,如果所有就绪线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些。分时调度模型:系统平均分配CPU的时间片,所有线程轮流占用CPU,即在时间片调度的分配上所有线程“人人平等”。作用:放弃当前的CPU资源,让其他任务去抢占CUP资源(只会给相同优先级或者更高优先级的现场运行的机会)运行中的线程不一定一直都会是运行状态,没有获得时间片又会回到就绪状态。就绪线程抢占到CPU时间片会进入到运行状态。

ChrisLee2013的博客 335

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java线程状态流转与实战场景剖析

本文深入剖析Java线程状态流转机制与实战应用场景,通过电商系统案例详解NEW、RUNNABLE、BLOCKED等六种线程状态的生命周期转换。结合线程池优化、死锁检测等实战经验,提供jstack、VisualVM等监控工具的使用技巧,帮助开发者高效管理多线程并发问题。

weixin_30682415的博客 360

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java 线程状态流转

线程一共有 6 种状态: NEW:新建状态,当一个线程被创建完成,还没有调用 start() 方法时,是这种状态。 RUNNABLE:可运行状态,当一个线程正在正常地执行 run() 中的代码时,是这种状态。可运行状态包含了 正在被 CPU 选中执行的状态。 等待 CPU 调度的状态。 BLOCKED:阻塞状态,当一个线程尝试获取对象的监视器锁失败时(例如未能争抢到对象的监视器锁,从而被 synchronized 关键字修饰的方法/代码块阻塞的线程,这些线程将会放到这个对象的阻塞池(entryLis

Bryant5051的博客 1420

java流转_Java线程状态流转---线程

说明:线程共包括以下5种状态。1.新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2.就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。3.运行状态(Ru...

weixin_36319938的博客 134

【并发基础】操作系统中线程/进程的生命周期与状态流转以及Java线程的状态流转详解

一篇文章帮你彻底搞懂操作系统中线程/进程的生命周期与状态流转。带你详细分析Java线程的状态流转,搞清楚Java线程和操作系统线程状态的区别。

小七的博客 2341

Java线程状态流转及部分函数说明

下面这张是Java线程状态改变的图例。 下面就其中几点和函数进行说明 运行态 Java将操作系统中的"运行中running"和"就绪ready"两种状态统称为运行态runnable。runing和ready的切换由操作系统进行调度。 join 让当前线程等待join线程执行完毕。如果join()方法在一个线程实例上调用,则当前运行着的线程将阻塞直到这个线程实例执行完毕。 该方法可以实现一个线程在另一个线程结束后再执行。 public class JoinTest { public static

huangsky001的博客 361

Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现

在前面几篇文章中,我们已经实现了线程池的核心功能:任务队列、执行逻辑以及线程管理。本次我们将继续扩展补充线程池的功能,为线程池添加生命周期管理。通过引入生命周期,我们能够更加灵活地管理和控制线程的创建、运行和销毁过程。可以更好地处理资源分配、任务调度和系统稳定性等方面的问题。

qq_35716689的博客 1万+

java 线程状态流转

线程间的状态转换:  1. 新建(new):新创建了一个线程对象。 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。 3. 运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice)

zhaoyan8783的专栏 983

Java线程状态流转---线程

说明:线程共包括以下5种状态。1.新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2.就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随...

anxia5150的博客 113
上一篇: java阻塞线程或繁忙线程的定位方式
下一篇: tcpdump常用参数以及wireshark密文解密
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值