Java多线程 —— 线程状态迁移

引言

线程状态迁移,又常被称作线程的生命周期,指的是线程从创建到终结需要经历哪些状态,什么情况下会出现哪些状态。

线程的状态直接关系着并发编程的各种问题,本文就线程的状态迁移做一初步探讨,并总结在何种情况下会出现这些状态,尝试将这些状态通过一些程序模拟出来。

一、六种状态

java.lang.Thread 的状态分为以下 6 种,它们以枚举的形式,封装在了Thread类内部:

NEW:表示线程刚刚创建出来,还未启动

RUNNABLE:可运行状态,该状态的线程可以是ready或running,唯一的决定因素是线程调度器

BLOCKED:阻塞,线程正在等待一个monitor锁以便进入一个同步代码块

WAITING:等待,一种挂起等待的状态。一个线程处于waiting是为了等待其他线程执行某个特定的动作。

TIMED_WAITING:定时等待。

TERMINATED:终结,线程执行结束后的状态。

二、状态迁移图

线程迁移图网上有很多,这是我自己参考着绘制的一张。

线程迁移图虽然是背了忘忘了背,反反复复很多遍,但是记忆这张图其实并不困难。首先就是NEW和TERMINATED状态,一个表示刚刚创建,一个表示任务结束。

最重要的是记住WAITING和BLOCKED这两种状态与RUNNABLE相互切换的条件。

BLOCKED状态在Java doc中的描述是“等待一个monitor锁”,monitor对象是与对象实例相关联的一个锁对象,这个锁对象实际上就是 synchronized 的具体实现,一般称之为重量级锁,进入同步代码块的过程,实际上就是获取到 monitor 对象的锁的过程。如果锁被其他线程占用,当前线程就变成了BLOCKED状态,如果得到了锁,就由BLOCKED切换到RUNNABLE状态。

WAITING 是一种挂起状态,处于 waiting 的线程表示它正在等待一个有缘人~ 这个有缘人需要执行特定的动作才能解救 waiting 中的线程。就像孙悟空在五指山下等了五百年,只有玄奘摘下山顶的符咒才能够破土而出。

导致 WAITING 的情况只有三种:

wait()

join()

LockSupport.park()

wait() 方法是 Object 的成员方法,它可以令当前线程针对于某个对象挂起等待,并释放获得的锁资源,只有当其他线程调用这个对象的notify()或 notifyAll() 方法,才能够唤醒等待中的线程。注意,notify()或 notifyAll() 不会释放锁资源。

join() 方法是线程的一个成员方法,“加入一个线程”,这好像合情合理,比如 t1线程在执行的过程中调用了 t2.join(),那么好吧, t1就会由 RUNNABLE 变为 WAITING,因为他要等待 t2 执行完后才会继续执行,说白了,就是方便程序员让线程插队用的:

LockSupport.park()更方便,它是一个静态方法,可以让线程在调用的位置直接WAITING,然后在其他线程中,获取到WAITING中的线程对象,传入LockSupport(thread) 直接恢复运行。

三、线程状态模拟

准备三个线程 monitor 监视线程,主要实时监视 t1线程的状态;

t1 线程模拟各种状态,t2 辅助 t1 模拟各种状态:

public class ThreadState {static Object lock = new Object();// 模拟 NEW、RUNNABLE、WAITING、TIMED_WAITING、BLOCKED、TERMINATEDpublic static void main(String[] args) {ThreadState thisObj = new ThreadState();Thread t1 = new Thread(() -> {try {// 先获取 t2 对象Thread t2 = getThreadByName("t2");// 先执行一套逻辑,推迟同步代码块的调用String str = "";for (int i = 0; i < 10000; i++) {str += i;}// 调用同步代码块thisObj.doSync();// t2准备插队t2.join();} catch (InterruptedException e) {e.printStackTrace();}}, "t1");System.out.println("t1 刚创建:" + t1.getState());Thread t2 = new Thread(() -> {try {// 直接获取同步锁thisObj.doSync();// 释放锁后在运行一段时间TimeUnit.SECONDS.sleep(30);} catch (Exception e) {e.printStackTrace();}}, "t2");Thread monitor = new Thread(() -> {Thread.State t1State = null;while (true) {if (!t1.getState().equals(t1State)) {t1State = t1.getState();System.out.println("t1 此刻状态:" + t1.getState());}if (t1State.equals(Thread.State.TERMINATED))break;}}, "monitor");monitor.start();t2.start();t1.start();}public synchronized void doSync() {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}String str = "";for (int i = 0; i < 100000; i++) {str += i;}}public static Thread getThreadByName(String name) {Optional<Thread> first = Thread.getAllStackTraces().keySet().stream().filter(thread -> thread.getName().equals(name)).findFirst();return first.get();}
}

输出:

t1 刚创建:NEW
t1 此刻状态:RUNNABLE
t1 此刻状态:BLOCKED
t1 此刻状态:TIMED_WAITING
t1 此刻状态:TIMED_WAITING
t1 此刻状态:RUNNABLE
t1 此刻状态:WAITING
t1 此刻状态:BLOCKED
t1 此刻状态:TERMINATED

总结

线程状态迁移是非常重要的多线程基础知识,在调试多线程问题的时候,能够发挥很大的作用。

6 种状态不仅要熟记,而且在什么情况下会出现这些状态也要清晰明了。

如果条件允许,可以试着通过不同的方法来模拟线程的六种状态的切换,可以加深对线程生命周期的理解。

 

 

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

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

相关文章

Java中的Unsafe

Java和C语言的一个重要区别就是Java中我们无法直接操作一块内存区域&#xff0c;不能像C中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C手动管理内存的能力。 Unsafe类&#xff0c;全限定名是sun.misc.Unsafe&#xff0c;从名字中我们可以看出来这个类对…

arm中断保护和恢复_浅谈ARM处理器的七种异常处理

昨天的文章&#xff0c;我们谈了ARM处理器的七种运行模式&#xff0c;分别是&#xff1a;用户模式User(usr)&#xff0c;系统模式System(sys)&#xff0c;快速中断模式(fiq)&#xff0c;管理模式Supervisor(svc)&#xff0c;外部中断模式(irq)&#xff0c;数据访问中止模式Abor…

Queue —— JUC 的豪华队列组件

目录引言一、Queue 的继承关系1.1 Queue 定义基础操作1.2 AbstractQueue 为子类减负1.3 BlockingQueue 阻塞式Queue1.4 Deque 两头进出二、Queue 的重要实现三、BlockingQueue 的实现原理四、Queue 在生产者消费者模式中的应用五、Queue 在线程池中的应用六、ConcurrentLinkedQ…

daad转换器实验数据_箔芯片电阻在高温应用A/D转换器中的应用

工业/应用领域高温&#xff1a;地震数据采集系统、石油勘探监测、高精度检测仪产品采用&#xff1a;V5X5 Bulk Metal (R) Foil芯片电阻案例介绍TX424是一个完整的4通道24位模数转换器&#xff0c;采用40脚封装。该设计采用最先进设计方案&#xff0c;两个双通道24位调节器和一个…

excel分段排序_学会这个神操作,报表填报不再五花八门,效率远超Excel

在报表工作人员的的日常工作中&#xff0c;常常要面临统计混乱的终端用户输入的问题。由于无法准确限制用户的输入内容&#xff0c;所以在最终进行数据统计时&#xff0c;常常会出现数据不合法的情况。为此需要花费大量的人力和时间核对校验数据。举个简单的例子&#xff0c;某…

IDEA——必备插件指南

目录一、Free-Mybatis-Plugin二、Lombok三、jclasslib Bytecode Viewer一、Free-Mybatis-Plugin 二、Lombok 三、jclasslib Bytecode Viewer 学习 class 文件的必备插件。 使用简单&#xff0c;安装后可以在菜单 View 中看到 show bytecode with jclasslib&#xff1a; 效果…

jitter 如何优化网络_如何做好关键词优化网络?

越来越多的传统企业开始建立自己的网站&#xff0c;进而不断的推广自己的产品。为了能够让自己的企业网站出现在搜索引擎的首页&#xff0c;现在最常用的手段就是竞价排名和关键词优化网络。往往很多企业会选择关键词优化网络这种方式来推广自己的网站&#xff0c;对于新手seoe…

python学生名片系统_Python入门教程完整版400集(懂中文就能学会)快来带走

如何入门Python&#xff1f;权威Python大型400集视频&#xff0c;学了Python可以做什么&#xff1f;小编今天给大家分享一套高老师的python400集视频教程&#xff0c;里面包含入门进阶&#xff0c;源码&#xff0c;实战项目等等&#xff0c;&#xff0c;不管你是正在学习中&…

JVM——详解类加载过程

导航一、过程概述二、Loading2.1 类加载器2.2 双亲委派机制2.3 类在内存中的结构三、Linking四、Initializing一、过程概述 java 源文件编译后会生成一个 .class文件存储在硬盘上。 在程序运行时&#xff0c;会将用到的类文件加载到 JVM 内存中。从磁盘到内存的过程总共分为三…

下载 Java 学习的权威文档

JVMS 和 JLS 文档的下载 快速直达&#xff1a; https://docs.oracle.com/javase/8/ --> Java Language and Virtual Machine Specifications jvm specification 和 java language specification 是Java 学习的两个最权威的文档。如果你用的是 Java 8&#xff0c;就可以去下载…

iso图像测试卡_4700万像素 五轴防抖 徕卡正式发布SL2无反相机

出自蜂鸟网-器材频道&#xff0c;原文链接&#xff1a;https://m.fengniao.com/document/5358989.html徕卡于今日正式发布SL2相机&#xff0c;搭载4700万像素CMOS感光元件、通过感光元件移位实现光学图像稳定的五轴防抖技术、全新徕卡物距探测式自动对焦技术以及576万像素分辨率…

JVM——对象的创建与内存布局

导航一、对象的创建过程二、对象的内存布局2.1 内存布局2.2 计算对象的内存大小三、对象的定位3.1 句柄池3.2 直接指针四、对象的分配过程一、对象的创建过程 对象&#xff0c;又叫实例&#xff0c;是 OOP 的最常用角色。 如何创建一个对象&#xff1f;一般都是使用 new 关键…

JVM垃圾收集器——G1

导航引言一、G1 介绍1.1 适用场景1.2 设计初衷1.3 关注焦点1.4 工作模式1.5 堆的逻辑结构1.6 主要收集目标1.7 停顿预测模型1.8 拷贝和压缩1.9 与 CMS 和 Parallel 收集器的比较1.10 固定停顿目标二、堆的逻辑分区2.1 region2.2 CSet2.3 RSet2.4 Card Table三、G1 的工作原理3.…

的mvc_简述PHP网站开发的MVC模式

为了提高开发时候的代码重用和开发速度&#xff0c;php使用了mvc的模式&#xff0c;主要是对代码的功能进行了分类&#xff0c;M&#xff1a;model主要是对数据库进行操作&#xff0c;v&#xff1a;view主要是前端html文件操作&#xff0c;c&#xff1a;controller主要是编写基…

CAP 原则与 BASE 理论

导航引言一、CAP 原则1.1 Consistency 一致性1.2 Available 可用性1.3 Partition tolerance 分区容错性1.4 CAP 的矛盾1.5 CAP 的组合场景二、BASE 理论2.1 基本可用2.2 软状态2.3 最终一致性2.3.1 因果一致性2.3.2 读自身所写2.3.3 会话一致性2.3.4 单调读一致性2.3.5 单调写一…

java 教室借用管理系统_[内附完整源码和文档] 基于JAVA语言的学生选课信息管理系统...

摘 要本系统运用Java面向对象的方法设计而成。近年来&#xff0c;学生选课系统越来越在高校学生群体中得到普及&#xff0c;其所承担的功能也变得越来越丰富&#xff0c;所起到的作用也变得越来越重要&#xff0c;在被学校学生重视的同时&#xff0c;也意味着它的功能要更加完善…

jMeter 模拟 web 高并发请求

导航一、jmeter 简介与下载二、接口压测设置三、实战演示一、jmeter 简介与下载 Apache JMeter是Apache组织开发的基于Java的压力测试工具。 最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c…

实施文档_建设工程监理全套资料范本,Word文档附百份案例表格,超实用

建设工程监理全套资料范本&#xff0c;Word文档附百份案例表格&#xff0c;超实用在日常工作中&#xff0c;监理人员不仅需要经常跑腿儿检查&#xff0c;同时还需要提交许许多多的资料存档&#xff0c;甚至可能需要熬夜码字。今天整理的监理资料范本&#xff0c;既能让监理人员…

微服务架构 —— 服务雪崩与容错方案

导航一、什么是服务雪崩二、雪崩效应的三个核心原因三、容错四、业界常见容错思路五、常见容错组件一、什么是服务雪崩 服务雪崩 指的是微服务架构中&#xff0c;微服务各节点之间由于网络通信异常或微服务自身故障等问题&#xff0c;导致请求堆积、任务堆积&#xff0c;消耗和…

手游方舟怎么输入代码_明日方舟再次登顶失败,为了不发十连奖励,鹰角实力控分?...

在明日方舟新版本活动“孤岛风云”正式上线后&#xff0c;关于干员的强度和游戏剧情的讨论也在最近多了起来。尤其是在一周年卫星干员山落地&#xff0c;并且人气干员塞雷娅背后的故事揭晓之后&#xff0c;明日方舟的热度也在玩家圈子中迅速的攀升&#xff0c;成为近期话题量十…