当前位置: 首页 > news >正文

【JavaEE】线程的状态

哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 多线程的 线程的状态,New 新建状态,Runnable 运行状态,Blocked 阻塞状态,waiting 等待状态,Time_Waiting 超时等待状态,Terminated 终止状态,以及展示线程的状态的常用方法。
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

一、线程的状态

表示线程当前所处的一个情况 ,线程有6 种状态,下文会详细讲述;

  1. New 新建状态:线程还没出创建,只有Thread 实例化的对象,调用start 方法之前的状态。

  1. Runnable 运行状态:被系统调度后,CPU 正在执行的,Ready 就绪态,系统调度,随时准备被CPU 执行。

  1. Blocked 阻塞状态:线程遇到某种机制之后不参与 CPU的调度执行,等待某个条件的触发唤醒线程

  1. waiting 等待状态: 无限期等待(死等)

  1. Time_Waiting 超时等待状态:设置了最大等待时间,超出最大等待时间就换醒线程

  1. Terminated 终止状态:线程生命周期结束后的状态

1.1 举例理解

关于线程的状态博主举个例子理解一下:

1. 张三和李四(两个线程)是邻居,他们打算一起去银行办理业务,首先他们两个到银行后进行挂号操作(new 新建状态),随后他们两个人在大厅的排队等待呼叫(线程 READY就绪状态)
2. “请 102号顾客来 1号窗口办理业务 —— 张三),当银行呼叫张三来1 号窗口办理业务我们可以看作是线程的调度,1号窗口我们认为是 CPU 的核心处理单元,为张三办理业务(处理线程),张三听到呼叫后,马上来到1号柜台,柜台小姐姐正式为张三办理业务(线程的运行状态)
3. 张三话不多说直接银行卡身份证递给小姐姐,张口就是我要取5 万块钱,小姐姐让张三输入密码,此时张老铁将银行卡密码忘记了,尝试了几次都不能成功,于是就给老婆打电话询问,结果显示正在通话中,无奈之下,只能感到很无奈,匆匆下线,那么导致业务办理不成功(线程堵塞)的原因是:忘记了密码。
4. 因为张三忘记了密码,暂时无法获取密码(老婆电话通话中),无法继续处理业务,所以陷入阻塞等待(可以联系上老婆询问密码),所以银行呼叫了下一个用户,请 103号顾客来 1号窗口办理业务 —— 李四),此时银行1号窗口可以看作是并行或并发的处理多线程,李四来处理业务就是从就绪状态到运行状态,李四张口就来,我要取 50万,柜台小姐姐说很抱歉暂时无法为您办理业务,根据规定大额取款需要提前三天预约,这边只能为您办理预约业务,您三天后可以来取,此时李四线程陷入了(等待状态,但是具有时效性,线程需要等3天就可以继续执行了),三天后李四的业务就可以继续处理。
5. 这边处理李四业务的时候,张三老铁终于拨通了电话,询得了密码,那么张三老铁又可以(此时忽略挂号)重新排队(张三获得密码,就从阻塞状态中唤醒,来到就绪状态准备被CPU 调度处理),请 104号顾客来 1号窗口办理业务 —— 张三,伴随着银行的呼叫,张三再次被调度,根据询问的密码,输入密码时提示成功,张老铁欣喜若狂,结果柜台小姐姐告知银行存款不足,无法取出相应的5万元金额(无法办理取钱业务),需要等待银行余额充裕后方可继续进行取钱,所以张三再次陷入等待状(线程等待)。
6. 当银行继续处理几个存钱业务后金额足够(线程等待结束条件),再呼叫张三来排队取钱,将张三从等待状态中唤醒,张三就继续排队(就绪),银行窗口办理业务(运行),取钱成功,线程结束。

1.2 阻塞、等待状态的同异

等待、阻塞可以看作不参加 CPU 的调度了,系统也不会安排该状态的线程被CPU 执行,两者的区别是:进入等待状态是线程主动的,而进入阻塞状态是被动的。

阻塞等待:

线程阻塞指一个线程在执行过程中暂停,等待某个条件的触发。一般会发生在线程加锁的情况下(synchronized),例如:两个线程同时对一片内存空间的数据进行增删查改,线程之间又是随机调度,很容易造成数据的误差问题,此时我们需要对该事务进行加锁操作(synchronized),什么意思,多线程之间并发执行,对事物加锁后,当一个线程对事物进行处理的时候,不允许其他线程对该事物进行操作,那么竞争事物的这个线程就会进行阻塞等待,直到先运行的线程对事物执行完毕。

运行的线程执行wait()方法,JVM(java虚拟机)会把该线程放入等待池中。wait() 方法:释放当前对象锁,然后使该线程进入等待状态“死等”(带参数的版本可以指定最大等待时间),不带参数的wait() 方法 需要其他线程使用notify() 方法来唤醒调用 wait() 方法的线程,当然 wait() 方法是建立在有锁对象的情况下(synchronized)。等到线程安全的章节博主再详细介绍

同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中,举个例子:两个线程同时处理一个“事务”势必会造成数据的安全问题,。


线程等待:

线程等待:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep() 线程休眠需要执行休眠时间,join() 方法线程等待,例如 : main 线程 调用 t.join 方法,意思就是 mian 线程需要等待 t 线程执行完毕后再执行自己,“死等”线程串行执行,join() 提供了一个带参数的版本可以指定最大等待时间,线程等待一般发生在主动的使线程进入等待状态。

BLOCKED 表示等待获取锁, WAITING 和 TIMED_WAITING 表示等待其他线程发来通知.

TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒


二、展示线程的常用方法

2.1 Thread.getState() 方法显示线程的状态

public static void main(String[] args) throws InterruptedException {Thread t = new Thread( () -> {while (true) {try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (Thread.currentThread()) {System.out.println("线程 T执行");try {Thread.currentThread().wait(); // 返回当前线程引用} catch (InterruptedException e) {e.printStackTrace();}}}});t.start(); //启动System.out.println(t.getState()); // 此时是主线程在判断 t 线程的状态,二者并无影响 Runnablet.sleep(1000); //t 线程休眠一秒 Time_WaitingSystem.out.println(t.getState());t.sleep(1000); //等待 t 线程调用 wait() 方法进入死等状态System.out.println(t.getState());}

2.2 isAlive 方法判定线程的存活状态

isAlive() 方法,可以认为是处于不是 NEW 和 TERMINATED 的状态都是活着的

2.3 yield() 主动结束CPU 调度执行

让出 CPU的执行时间片, yield 不改变线程的状态, 但是会让调用的线程由运行状态重新进入就绪(排队)状态,二者都是属于运行状态,只不过是CPU 并发执行线程,有人正在执行就有人准备被执行。

 public static void main(String[] args) throws InterruptedException {Thread t = new Thread( () -> {int i = 0;while (true) {i++;System.out.print("t 线程执行");if((i + 1 )% 10 == 0) {System.out.println();}Thread.currentThread().yield(); //让出CPU 执行时间片}});t.start(); //启动int i = 0;while (true) {System.out.print("main 线程执行");i++;if((i + 1 )% 10 == 0) {System.out.println();}}}

由此可见本来是两个线程并发执行,但是由于 t 线程调用 yiele()方法后主动让出 CPU 的时间片,所以多数情况下是 main 线程在执行。


至此,Java 线程的状态,博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。

本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。

下期预告:线程安全相关问题

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

相关文章:

【JavaEE】线程的状态

哈喽,大家好~我是保护小周ღ,本期为大家带来的是 Java 多线程的 线程的状态,New 新建状态,Runnable 运行状态,Blocked 阻塞状态,waiting 等待状态,Time_Waiting 超时等待状态,Termin…...

7个最受瞩目的 Python 库,提升你的开发效率

当今时代,数据分析和处理已经成为了各行各业中不可或缺的一环。Python作为一种非常流行的编程语言,为我们提供了许多强大的工具和库来处理不同类型的数据。 在这篇文章中,我将向您介绍七个非常有用的Python库,这些库各自有着独特…...

这些IT行业趋势,将改变2023

上一周,你被"AI"刷屏了吗? 打开任何一家科技媒体,人工智能都是不变的热门话题。周初大家还在用ChatGPT写论文、查资料、写代码,到周末的时候大家已经开始用GPT-4图像识别来做饭、Microsoft 365 Copilot 来写PPT了。 GP…...

蓝桥杯每日一真题——[蓝桥杯 2021 省 B] 杨辉三角形(二分+规律)

文章目录[蓝桥杯 2021 省 B] 杨辉三角形题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路:全部代码:[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&…...

<C++> 类和对象(下)

1.const成员函数将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。class A { public:void Print() //这里隐藏了A* this指针{cout <…...

基于Springboot+Vue2前后端分离框架的智慧校园系统源码,智慧学校源码+微信小程序+人脸电子班牌

▶ 智慧校园开发环境&#xff1a; 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语音开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&#xff0c;jwt 智慧校园结构导图▶ 这…...

JavaEE-线程安全问题

1.线程安全的概念 如果多线程环境下代码运行的结果是符合我们预期的&#xff0c;即在单线程环境应该的结果&#xff0c;则说这个程序是线 程安全的. 为啥会出现线程安全问题? 本质原因: 线程在系统中的调度是无序的/随机的 (抢占式执行). 2.开始说明 先看个线程不安全的例子…...

【Node.js】身份认证,Cookie和Session的认证机制,express中使用session认证和JWT认证

Node.jsWeb开发模式如何选择Web开发模式身份认证什么是身份认证为什么要身份认证不同开发模式的身份认证Session认证机制提高身份认证的安全性Session的工作原理Express中使用Session认证Session认证机制的局限性JWT认证机制JWT的工作原理JWT的组成部分Express中使用JWT在登录成…...

Redis删除策略和淘汰策略

一、删除策略 删除策略就是针对已过期数据的处理策略。 针对过期数据要进行删除的时候都有哪些删除策略呢&#xff1f; 1.定时删除2.惰性删除3.定期删除1、立即删除 当key设置有过期时间&#xff0c;且过期时间到达时&#xff0c;由定时器任务立即执行对键的删除操作。 优…...

LFM雷达实现及USRP验证【章节2:LFM雷达测距】

目录 1. 参数设计 几个重要的约束关系 仿真参数设计 2. matlab雷达测距代码 完整源码 代码分析 回顾&#xff1a;LFM的基本原理请详见第一章 本章节将介绍LFM雷达测距的原理及实现 1. 参数设计 几个重要的约束关系 带通采样定理&#xff1a; 因此如果我们B80MHz时&a…...

菜鸟刷题Day5

⭐作者&#xff1a;别动我的饭 ⭐专栏&#xff1a;菜鸟刷题 ⭐标语&#xff1a;悟已往之不谏&#xff0c;知来者之可追 一.一维数组的动态和&#xff1a;1480. 一维数组的动态和 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个数组 nums 。数组「动态和」的计算公式…...

已解决AttributeError:module tensorflow no attribute app异常的正确解决方法,亲测有效!!!

已解决AttributeError&#xff1a;module tensorflow no attribute app异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录报错问题解决方法福利报错问题 粉丝群里面的一个小伙伴敲代码时发生了报错&#xff08;当时他心里瞬间凉了一大截&…...

Hadoop集群环境配置搭建

一、简单介绍 Hadoop最早诞生于Cutting于1998年左右开发的一个全文文本搜索引擎 Lucene&#xff0c;这个搜索引擎在2001年成为Apache基金会的一个子项目&#xff0c;也是 ElasticSearch等重要搜索引擎的底层基础。 项目官方&#xff1a;https://hadoop.apache.org/ 二、Linux环…...

Thread类的基本用法

Thread类的基本用法&#x1f50e;1.线程创建&#x1f33b;继承Thread类&#x1f33c;继承Thread重写run()方法&#x1f33c;继承Thread匿名内部类&#x1f33b;实现Runnable接口&#x1f33c;实现Runnable接口重写run()方法&#x1f33c;实现Runnable接口匿名内部类&#x1f33…...

YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)

YOLOV8改进&#xff1a;如何增加注意力模块&#xff1f;&#xff08;以CBAM模块为例&#xff09;前言YOLOV8nn文件夹modules.pytask.pymodels文件夹总结前言 因为毕设用到了YOLO&#xff0c;鉴于最近V8刚出&#xff0c;因此考虑将注意力机制加入到v8中。 YOLOV8 代码地址&am…...

Spark Streaming DStream的操作

一、DStream的定义 DStream是离散流&#xff0c;Spark Streaming提供的一种高级抽象&#xff0c;代表了一个持续不断的数据流。DStream可以通过输入数据源来创建&#xff0c;比如Kafka、Flume&#xff0c;也可以通过对其他DStream应用高阶函数来创建&#xff0c;比如map、redu…...

蓝桥杯冲刺 - week1

文章目录&#x1f4ac;前言&#x1f332;day192. 递归实现指数型枚举843. n-皇后问题&#x1f332;day2日志统计1209. 带分数&#x1f332;day3844. 走迷宫1101. 献给阿尔吉侬的花束&#x1f332;day41113. 红与黑&#x1f332;day51236. 递增三元组&#x1f332;day63491. 完全…...

Leetcode27. 移除元素

目录一、题目描述&#xff1a;二、解决思路和代码1. 解决思路2. 代码一、题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用…...

ViewService——一种保证客户端与服务端同步的方法

简介在分布式系统中&#xff0c;最常见的场景就是主备架构。但是如果主机不幸宕机&#xff0c;如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题。本文描述了一种简单的模型用于解决此问题。背景以一个分布式的Key-Value数据库为背景。数据库对外提供3个接口Ge…...

使用STM32F103ZE开发贪吃蛇游戏

目录 前言 一、设置FreeROTS用户任务 &#xff08;1&#xff09;事件event任务 &#xff08;2&#xff09;按键输入方向控制任务 &#xff08;3&#xff09;果实食物任务 &#xff08;4&#xff09;显示任务函数 &#xff08;3&#xff09;开始任务 二、主函数 三、ADC采样…...

3步释放华硕笔记本潜能:G-Helper轻量化控制工具的极致优化指南

3步释放华硕笔记本潜能&#xff1a;G-Helper轻量化控制工具的极致优化指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

translategemma-27b-it入门必看:Gemma3轻量化设计如何平衡精度与推理速度

translategemma-27b-it入门必看&#xff1a;Gemma3轻量化设计如何平衡精度与推理速度 本文深度解析基于Gemma 3构建的TranslateGemma-27B-IT模型&#xff0c;通过实际部署演示展示其如何在保持翻译精度的同时实现高效推理&#xff0c;为开发者提供完整的入门指南。 1. 认识Tran…...

AI智能体工作完整源码大公开!企业级多Agent框架,一键私有化部署

温馨提示&#xff1a;文末有资源获取方式最近“龙虾AI”的热度席卷技术圈&#xff0c;大家都在讨论如何“养殖”自己的智能体。但真正落地时&#xff0c;技术门槛、Token消耗与复杂的协同问题&#xff0c;往往让普通用户和企业望而却步。今天我们不谈概念&#xff0c;直接分享一…...

音频标注:从原理到产业,AI听懂世界的“翻译官”

音频标注&#xff1a;从原理到产业&#xff0c;AI听懂世界的“翻译官” 引言 在人工智能的浪潮中&#xff0c;计算机视觉的“看”和自然语言处理的“读”已广为人知&#xff0c;而让机器学会“听”——理解并解析复杂的声音世界&#xff0c;正成为新的前沿。这一切的基石&…...

AI短剧的风口来了!无需编程,全程技术支持,助你快速贴牌部署私有化系统

&#x1f525; AI短剧爆火&#xff0c;但你还在因为“没有技术团队”而错失风口&#xff1f; 2024-2025年&#xff0c;AI短剧无疑是内容创业最大的黑马。从AI换脸、AI配音到一键生成剧本&#xff0c;市场的需求呈指数级爆发。 然而&#xff0c;对于大多数手握流量渠道、有客户…...

百川2-13B模型安全测试:OpenClaw在防御恶意指令方面的表现

百川2-13B模型安全测试&#xff1a;OpenClaw在防御恶意指令方面的表现 1. 为什么需要测试AI助手的安全性 去年我在本地部署了一个自动化助手&#xff0c;本想让它帮我整理文档和收发邮件。结果有次不小心让它执行了一个包含rm -rf的命令&#xff0c;差点把工作目录清空。这次…...

如何让扫描PDF变得可搜索?OCRmyPDF-Desktop完整解决方案

如何让扫描PDF变得可搜索&#xff1f;OCRmyPDF-Desktop完整解决方案 【免费下载链接】pdfocr-desktop PDF OCR Application, adds an OCR text layer to scanned PDF files, allowing them to be copied and searched. 项目地址: https://gitcode.com/gh_mirrors/oc/pdfocr-d…...

FLUX.1-dev像素生成器效果对比:不同Scale值对像素结构强度影响实测

FLUX.1-dev像素生成器效果对比&#xff1a;不同Scale值对像素结构强度影响实测 1. 像素艺术生成技术概述 像素幻梦&#xff08;Pixel Dream Workshop&#xff09;是基于FLUX.1-dev扩散模型构建的专业像素艺术生成工具。它采用16-bit现代明亮风格设计&#xff0c;为创作者提供…...

如何快速上手uesave-rs:虚幻引擎存档编辑的终极指南

如何快速上手uesave-rs&#xff1a;虚幻引擎存档编辑的终极指南 【免费下载链接】uesave 项目地址: https://gitcode.com/gh_mirrors/ue/uesave 还在为无法修改心爱游戏的存档而烦恼吗&#xff1f;想要自定义游戏体验却不知从何下手&#xff1f;uesave-rs这款强大的Rus…...

Chrome密码提取终极指南:ChromePass工具完整使用教程

Chrome密码提取终极指南&#xff1a;ChromePass工具完整使用教程 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经因为忘记某个重要网站的登录密码而感到困扰&#xf…...