11. Java线程的状态详解

1. 前言

本节内容主要是对多线程的 6 种状态进行详细讲解,具体内容点如下:

  • 抛开语言,谈操作系统的线程的生命周期及线程 5 种状态,这是我们学习 Java 多线程 6 种状态的基础;
  • 掌握 Java 的线程生命周期及 6 种线程状态,是我们本节课程的重点内容;
  • 理解 Java 线程 6 种状态的定义,并且通过代码实例进行实战演练,更深入的掌握线程的 6 种不同状态,是我们本节内容的核心知识;
  • 掌握 Java 线程不同状态之间的转变关系,更好地理解线程的不同状态,是我们本节课程的重点。

2. 操作系统线程的生命周期

定义:当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建 (New)、就绪(Runnable)、运行(Running)、阻塞 (Blocked),和死亡 (Dead) 5 种状态。

从线程的新建 (New) 到死亡 (Dead),就是线程的整个生命周期。

下面我们分别对 5 种不同的状态进行概念解析。

新建 (New):操作系统在进程中新建一条线程,此时线程是初始化状态。

就绪 (Runnable):就绪状态,可以理解为随时待命状态,一切已准备就绪,随时等待运行命令。

运行 (Running):CPU 进行核心调度,对已就绪状态的线程进行任务分配,接到调度命令,进入线程运行状态。

阻塞 (Blocked):线程锁导致的线程阻塞状态。共享内存区域的共享文件,当有两个或两个以上的线程进行非读操作时,只允许一个线程进行操作,其他线程在第一个线程未释放锁之前不可进入操作,此时进入的一个线程是运行状态,其他线程为阻塞状态。

死亡 (Dead):线程工作结束,被操作系统回收。

3. Java 的线程的生命周期及状态

定义: 在 Java 线程的生命周期中,它要经过新建(New),运行(Running),阻塞(Blocked),等待(Waiting),超时等待(Timed_Waiting)和终止状态(Terminal)6 种状态。

从线程的新建(New)到终止状态(Terminal),就是线程的整个生命周期。

Tips :与操作系统相比, Java 线程是否少了 “就绪” 状态 ?其实 Java 线程依然有就绪状态,只不过 Java 线程将 “就绪(Runnable)" 和 “运行(Running)” 两种状态统一归结为 “运行(Running)” 状态。

我们来看下 Java 线程的 6 种状态的概念。

新建 (New):实现 Runnable 接口或者继承 Thead 类可以得到一个线程类,new 一个实例出来,线程就进入了初始状态。

运行 (Running):线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一方式。

阻塞 (Blocked):阻塞状态是线程在进入 synchronized 关键字修饰的方法或者代码块时,由于其他线程正在执行,不能够进入方法或者代码块而被阻塞的一种状态。

等待 (Waiting):执行 wait () 方法后线程进入等待状态,如果没有显示的 notify () 方法或者 notifyAll () 方法唤醒,该线程会一直处于等待状态。

超时等待 (Timed_Waiting):执行 sleep(Long time)方法后,线程进入超时等待状态,时间一到,自动唤醒线程。

终止状态 (Terminal):当线程的 run () 方法完成时,或者主线程的 main () 方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。

4. 新建(New)状态详解

实例

public class ThreadTest implements Runnable{@Overridepublic void run() {System.out.println("线程:"+Thread.currentThread()+" 正在执行...");}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new ThreadTest()); //线程 创建(NEW)状态}
}

这里仅仅对线程进行了创建,没有执行其他方法。 此时线程的状态就是新建 (New) 状态。

Tips:新建(New)状态的线程,是没有执行 start () 方法的线程。

5. 运行(Running)状态详解

定义: 线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一方式。

public class ThreadTest implements Runnable{.......public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new ThreadTest()); //线程 创建(NEW)状态t1. start(); //线程进入 运行(Running)状态}
}

当线程调用 start () 方法后,线程才进入了运行(Running)状态。

6. 阻塞(Blocked)状态详解

定义: 阻塞状态是线程阻塞在进入 synchronized 关键字修饰的方法或者代码块时的状态。
我们先来分析如下代码。

实例

public class DemoTest implements Runnable{@Overridepublic void run() {testBolockStatus();}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new DemoTest()); //线程 t1创建(NEW)状态t1.setName("T-one");Thread t2 = new Thread(new DemoTest()); //线程 t2创建(NEW)状态t2.setName("T-two");t1. start(); //线程 t1 进入 运行(Running)状态t2. start(); //线程 t2 进入 运行(Running)状态}public static synchronized void testBolockStatus(){ // 该方法被 synchronized修饰System.out.println("我是被 synchronized 修饰的同步方法, 正在有线程" +Thread.currentThread().getName() +"执行我,其他线程进入阻塞状态排队。");}
}

代码分析

首先,请看关键代码

t1. start(); //线程 t1 进入 运行(Running)状态
t2. start(); //线程 t2 进入 运行(Running)状态

我们将线程 t1 和 t2 进行 运行状态的启动,此时 t1 和 t2 就会执行 run () 方法下的 sync testBolockStatus () 方法。

然后,请看关键代码

public static synchronized void testBolockStatus(){ // 该方法被 synchronized修饰

testBolockStatus () 方法是被 synchronized 修饰的同步方法。当有 2 条或者 2 条以上的线程执行该方法时, 除了进入方法的一条线程外,其他线程均处于 “阻塞” 状态。

最后,我们看下执行结果

我是被 synchronized 修饰的同步方法, 正在有线程T-one执行我,其他线程进入阻塞状态排队。
我是被 synchronized 修饰的同步方法, 正在有线程T-two执行我,其他线程进入阻塞状态排队。

执行结果解析:我们有两条线程, 线程名称分别为: T-one 和 T-two。

  • 执行结果第一条: T-one 的状态当时为 运行(Running)状态,T-two 状态为 阻塞(Blocked)状态;
  • 执行结果第二条: T-two 的状态当时为 运行(Running)状态,T-one 状态为 阻塞(Blocked)状态。

7. 等待(Waiting)状态详解

定义: 执行 wait () 方法后线程进入等待状态,如果没有显示的 notify () 方法或者 notifyAll () 方法唤醒,该线程会一直处于等待状态。

我们通过代码来看下,等待(Waiting)状态。

实例

public class DemoTest implements Runnable{@Overridepublic void run() {try {testBolockStatus();} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new DemoTest()); //线程 t1创建(NEW)状态t1.setName("T-one");t1. start(); //线程进入 运行 状态}public synchronized void testBolockStatus() throws InterruptedException {System.out.println("我是线程:" + Thread.currentThread().getName() + ". 我进来了。");this.wait(); //线程进入 等待状态 ,没有其他线程 唤醒, 会一直等待下去System.out.println("我是被 synchronized 修饰的同步方法, 正在有线程" +Thread.currentThread().getName() +"执行我,其他线程进入阻塞状态排队。");}
}

注意看下关键代码

this.wait(); //线程进入 等待状态 ,没有其他线程 唤醒, 会一直等待下去

这里调用了 wait () 方法。线程进入 等待(Waiting)状态。如果没有其他线程唤醒,会一直维持等待状态。

运行结果

我是线程:T-one. 我进来了。

没有办法打印 wait () 方法后边的执行语句,因为线程已经进入了等待状态。

8. 超时等待(Timed-Waiting)状态详解

定义: 执行 sleep(Long time)方法后,线程进入超时等待状态,时间一到,自动唤醒线程。
我们通过代码来看下,超时等待(Timed-Waiting)状态。

实例

public class DemoTest implements Runnable{@Overridepublic void run() {.....}public static void main(String[] args) throws InterruptedException {.....}public synchronized void testBolockStatus() throws InterruptedException {System.out.println("我是线程:" + Thread.currentThread().getName() + ". 我进来了。");Thread.sleep(5000); //超时等待 状态 5 秒后自动唤醒线程。System.out.println("我是被 synchronized 修饰的同步方法, 正在有线程" +Thread.currentThread().getName() +"执行我,其他线程进入阻塞状态排队。");}
}

注意看下关键代码

Thread.sleep(5000); //超时等待 状态 5 秒后自动唤醒线程。

这里调用了 sleep () 方法。线程进入超时等待(Timed-Waiting)状态。超时等待时间结束,自动唤醒线程继续执行。

运行结果:5 秒后,打印第二条语句。

我是线程:T-one. 我进来了。
我睡醒了。我是被 synchronized 修饰的同步方法, 正在有线程T-one执行我,其他线程进入阻塞状态排队。

9. 终止(Terminal)状态定义

定义: 当线程的 run () 方法完成时,或者主线程的 main () 方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。

10. 小结

本节的重中之重在于线程的 6 种不同的状态,本节所有的内容都围绕这 6 种不同的状态进行的讲解,这也是本小节的核心内容,也是必须要掌握的内容。

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

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

相关文章

电脑没声音是什么原因?一篇文章帮你解决疑惑

在使用电脑时,声音是至关重要的一部分,无论是播放音乐、观看视频还是进行视频会议。然而,有时候电脑可能会出现没声音的情况,这让人感到非常困扰。那么电脑没声音是什么原因呢?本文将详细介绍解决电脑没声音问题的三种…

机器人自主学习方法学习

各类算法的优缺点 原理: 该结构中初始的知识为0,不存在任何先验知识,让机器人与环境交互不断获得经验,是一个增量学习的过程。 算法举例 基于强化学习的开源算法及工具 OpenAI Gym:用于开发和比较强化学习算法的工具…

电脑开不了机怎么办?无响应就试试这3个方法,快速解决黑屏

当电脑突然变得沉默寡言,没有任何响应,屏幕只剩下一片漆黑时,不仅会打断我们的计划,还可能让我们感到无助和焦虑。电脑开不了机怎么办呢?如果你正面临这样的困境,别担心,本文将引导你通过三个简…

姚期智、张亚勤、薛澜、Stuart Russell、Max Tegmark,DeepMind研究员等共话全球AI治理丨大会回顾...

为什么AI安全已迫在眉睫?如何构建全球范围内的合作?民众该如何参与到其中?未来的AI系统将是什么样的? 2024年6月15日,智源大会第二天,多位AI安全领域专家进行圆桌讨论,连接中国北京和美国加利福…

Unity编辑器工具---版本控制与自动化打包工具

Unity - 特殊文件夹【作用与是否会被打包到build中】 Unity编辑器工具—版本控制与自动化打包工具: 面板显示:工具包含一个面板,用于展示软件的不同版本信息。版本信息:面板上显示主版本号、当前版本号和子版本号。版本控制功能…

企业数据挖掘平台产品特色及合作案例介绍

泰迪企业数据挖掘平台是一款通用的、企业级、智能化的数据分析模型构建与数据应用场景设计工具,能够一体化地完成数据集成、模型构建、模型发布,为数据分析、探索、服务流程提供支撑,提供完整的数据探索、多数据源接入、特征处理、模型搭建、…

基于KNN的旋转机械故障诊断(MATLAB)

KNN算法又称K-近邻算法,其主要思想是:对于要分类的样本按照一定的相似性度量方法寻找与之最近的K个邻居,计算这K个邻居中类别出现次数最多的那个类作为该样本所属类。其算法步骤如下。 (1)计算待分类样本与训练集中各个数据之间的距离。 (2…

mybatis-plus 实体中空字段更新不上

FieldStrategy 是一个枚举类型,它定义了字段的几种策略: IGNORED:忽略判断,所有字段都进行更新操作 NOT_NULL:非 NULL 判断(默认策略),字段非 NULL 才进行更新 NOT_EMPTY&#xff…

Kompas AI数据分析与预测功能对比

一、引言 在现代商业环境中,数据分析与预测是企业制定战略决策的关键工具。通过对大量数据的分析,企业能够识别趋势、预测未来变化,并做出更为明智的决策。本文将对比Kompas AI与其他主要AI产品在数据分析与预测方面的能力,展示K…

【芯片】MCU的分类

MCU又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都…

智能扫地机,让生活电器更加便民-NV040D扫地机语音方案

一、语音扫地机开发背景: 随着人工智能和物联网技术的飞速发展,智能家居设备已成为现代家庭不可或缺的一部分。其中,扫地机作为家庭清洁的重要工具,更是得到了广泛的关注和应用。 然而,传统的扫地机在功能和使用上仍存…

计算机网络之入门

1.网络的发展 1.1计算机网络定义 计算机网络是以共享资源(硬件、软件和数据等)为目的而连接起来的、在协议控制下,由一台或多台计算机、若干台终端设备、数据传输设备等组成的系统之集合。 这些计算机系统应当具有独立自治的能力&#xff…

无芯封装基板适用于先进封装技术 我国行业发展面临一定挑战

无芯封装基板适用于先进封装技术 我国行业发展面临一定挑战 无芯封装基板指去除作为核心支撑层的芯板,仅由积层板构成的封装基板。与传统带有芯层的封装基板相比,无芯封装基板具有轻量化、密度高、信号传输质量高、散热性能好、布线灵活性好等优势&#…

为什么每一名程序员都应该学习 C++?

掌握 C 可不容易,但一旦你掌握了,就会获得丰厚的回报。 通常,程序员在他们的编程生涯中会使用多种编程语言。然而,我们也看到,有些程序员一直在使用同一种编程语言。例如,我们经常遇到有几十年经验的 Java…

pd17虚拟机安装包:Parallels Desktop 17 激活版

Parallels Desktop 17 是一款功能强大的虚拟机软件,可以在 Mac 计算机上运行 Windows、Linux 和其他操作系统。使用 Parallels Desktop,您可以创建虚拟机并在其中安装各种操作系统,从而能够在同一台计算机上同时运行多个操作系统。 该软件具…

华为仓颉编程语言正式发布,仓颉编程教程

目录 前言 基本概念 标识符 变量 类型 基础数据类型 表达式 if 表达式 while 表达式 for-in 表达式 程序结构 函数 定义函数 调用函数 lambda表达式 应用实例(遍历目录) 枚举 定义与实例化 成员访问规则 match表达式 应用实例&…

探索ONLYOFFICE桌面编辑器8.1:更强大的办公软件(新功能全新详解)

引入 时间到达2024年,办公软件已经成为不可或缺的的一部分。想到办公软件不知道大家首先想到那些产品 office 亦或是 WPS,但一个前者需要购买才能使用完整服务,一个漫天的弹广告不充会员什么都用不了。那难道世面上就没有一块正在好用无广告的…

Clonable接口和拷贝

Hello~小伙伴们!本篇学习Clonable接口与深拷贝,一起往下看吧~(画图水平有限,两张图,,我真的画了巨久,求路过的朋友来个3连~阿阿阿~~~) 目录 1、Clonable接口概念 2、拷贝 2、1浅拷贝 2、2深拷贝 1、Clon…

Linux学习第52天:Linux网络驱动实验(三):一往(网)情深

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 许久没有更新,的确是最近有点懈怠了。没有任何借口,接受所有的批评。接下来无论如何也要坚持下去,不管处于什么境地、什么原因&am…

鼠标与键盘交互设计

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在海龟绘图中,也支持与鼠标或键盘的交互操作。它提供了监听键盘按键事件、鼠标事件以及定时器等方法,下面分别进行介绍。 1键…