线程状态转换

       📝个人主页:五敷有你      
 🔥系列专栏:并发编程

⛺️稳中求进,晒太阳

程状态转换

假设有线程Thread t

情况1 new-->RUNNABLE

当调用t.start()方法时,由new ->RUNNABLE

情况2 RUNNABLE WAITING

t线程使用synchronized(obj) 获取对象锁后

public class TestWaitNotify {final static Object obj = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (obj) {log.debug("执行....");try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}log.debug("其它代码...."); // 断点}},"t1").start();new Thread(() -> {synchronized (obj) {log.debug("执行....");try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}log.debug("其它代码...."); // 断点}},"t2").start();sleep(0.5);log.debug("唤醒 obj 上其它线程");synchronized (obj) {obj.notifyAll(); // 唤醒obj上所有等待线程 断点}}}
  • 调用obj.wait() 方法时,t线程从RUNNABLE -->WAITING
  • 调用obj.notify(), obj.notifyAll() ,obj.interrupt() 时
    • 竞争失败,t线程从WAITING-->BLOCKED
    • 竞争成功,t线程从WAITING->RUNNABLE

情况 3 RUNNABLE WAITING

  • 当前线程调用t.join()方法时,当前线程从RUNNING --> WAITING
    • 注意是当前线程在t线程对象的监视器上等待
    • t线程运行结束,或调用当前线程的interrupt(),时,当前线程从WAITING-->RUNNABLE

情况 4 RUNNABLE WAITING

当前线程调用LockSupport.park() 方法会让当前线程从 RUNNABLE --> WAITING

调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING -->RUNNABLE

情况 5 RUNNABLE TIMED_WAITING

t线程用 synchronized(obj) 获取了对象锁后

  • 调用 obj.wait(long n) 方法时,t线程从RUNNABLE --> TIME_WAITING
  • t线程等待时间超过n毫秒 或调用obj.notify() , obj.notifyAll() , t.interrupt() 时
    • 竞争锁成功,t线程 从 TIMED_WAITING --> RUNNABLE
    • 竞争锁失败,t线程 从 TIMED_WAITING --> BLOCKED

情况 6 RUNNABLE TIMED_WAITING

当前线程调用 t.join(long n) 方法时,当前线程从 RUNNABLE --> TIMED_WAITING

注意是当前线程在t 线程对象的监视器上等待

当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从TIMED_WAITING --> RUNNABLE

情况 7 RUNNABLE TIMED_WAITING

当前线程调用 Thread.sleep(long n) ,当前线程从 RUNNABLE --> TIMED_WAITING

当前线程等待时间超过了 n 毫秒,当前线程从 TIMED_WAITING --> RUNNABLE

情况 8 RUNNABLE TIMED_WAITING

当前线程调用 LockSupport.parkNanos(long nanos) 或 LockSupport.parkUntil(long millis) 时,当前线程从 RUNNABLE --> TIMED_WAITING

调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从TIMED_WAITING--> RUNNABLE

情况 9 RUNNABLE BLOCKED

t 线程用 synchronized(obj) 获取了对象锁时如果竞争失败,从 RUNNABLE --> BLOCKED

持 obj 锁线程的同步代码块执行完毕,会唤醒该对象上所有 BLOCKED 的线程重新竞争,如果其中 t 线程竞争成功,从 BLOCKED --> RUNNABLE ,其它失败的线程仍然 BLOCKED

情况 10 RUNNABLE TERMINATED

当前线程所有代码运行完毕,进入 TERMINATED

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

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

相关文章

实验六 模式对象管理与安全管理

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

MySQL---单表查询综合练习

创建emp表 CREATE TABLE emp( empno INT(4) NOT NULL COMMENT 员工编号, ename VARCHAR(10) COMMENT 员工名字, job VARCHAR(10) COMMENT 职位, mgr INT(4) COMMENT 上司, hiredate DATE COMMENT 入职时间, sal INT(7) COMMENT 基本工资, comm INT(7) COMMENT 补贴, deptno INT…

软考系分之计算机网络通信方向、同步和交换

文章目录 1、概述2、通信方向和同步3、交换方式4、总结 1、概述 本篇依旧是一图概括主要考察的知识点,包括通信方向(单工、半双工、全双工),同步方式和数据交换等。 2、通信方向和同步 通信方向(单工、半双工、全双工…

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

在微信公众号中加入ChatGPT聊天的方法

1 介绍 开源项目 "chatgpt-on-wechat" 支持通过微信公众号进行调用,这意味着用户可以在与公众号的交互中体验 ChatGPT。由于服务是部署在远端服务器上的,因此用户只需拥有一部手机,就可以在任何环境下与 ChatGPT 进行交流。例如&am…

排序算法9----计数排序(C)

计数排序是一种非比较排序,不比较大小 。 1、思想 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 2、步骤 1、统计数据:统计每个数据出现了多少次。(建立一个count数组,范围从[MIN,MAX],MAX代表arr中…

Unity-Arduino Bluetooth Plugin蓝牙插件使用时需要注意的一些事项(附插件下载链接)

一些参考链接 1.Android 无法扫描蓝牙设备踩坑 2.权限相关 1-首先要明确你的蓝牙设备是经典蓝牙还是低功耗(BLE)蓝牙: 转载:Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别 2.如果是BLE蓝牙,需要打勾…

LabVIEW模拟荧光显微管滑动实验

LabVIEW模拟荧光显微管滑动实验 在现代生物医学研究中,对微观生物过程的精准模拟和观察至关重要。本案例展示了如何利用LabVIEW软件和专业硬件平台,创新地模拟荧光显微管在滑动实验中的动态行为,这一过程不仅提升了实验效率,还为…

MacMaster:一款功能强大的高级网络接口管理与监控工具

关于MacMaster MacMaster是一款功能强大的高级网络接口管理与监控工具,该工具专为网络安全研究人员打造,支持对各种不同系统网络接口的MAC地址进行管理。 MacMaster本质上是一个全面的命令行工具,该工具在设计之初就考虑到的简单性和功能性…

【算法详解】力扣162.寻找峰值

​ 目录 一、题目描述二、思路分析 一、题目描述 力扣链接:力扣162.寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个…

cetos7搭建部署k8s 版本1.28

主机分配 内存最少是4G cpu个数最少两个 IP内存CPU主机名192.168.231.12044K1 192.168.231.12144K2192.168.231.12244K3 关闭防火墙 systemctl stop firewalled 关闭swap vim /etc/fstab 设置主机名称 hostnameset 安装docker 三个主机 初始化集群 在mas…

机器学习之聚类-2D数据类别划分

无监督学习(Unsupervised Learning) 机器学习的一种方法,没有给定事先标记过的训练示例,自动对输入的数据进行分类或分群。 方式一:站着或坐着 方式二:全身或半身 方式三:蓝眼球或不是蓝眼球 …