【深入浅出Java并发编程指南】「难点 - 核心 - 遗漏」线程状态流转及生命周期的技术指南(知识点串烧)

news2025/1/12 12:14:38

前提介绍

本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍。

线程状态流转及生命周期

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪/可运行状态(Runnable)、阻塞(Blocked)和等待(Wait)、时间等待(Time_wait)、终止状态(Terminate)六种状态。尤其是当线程启动以后,它不能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

下图借鉴于官方网站:

在这里插入图片描述

生命周期的六种状态

一个事物从出生的那一刻开始到最终死亡中间的整个过程.在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态/中年状态/老年状态…).线程也是有生命周期的,也是存在不同的状态的,状态相互之间的转换。

线程对象的状态存放在Thread类的内部类(State)中:

 public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
        TERMINATED;
    }

注意:Thread.State类其实是一个枚举类.因为线程对象的状态是固定的,只有6种,此时使用枚举来表示是。


新建(new Thread)
  • 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。

  • 使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前。 新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已.Thread t = new Thread();

  • 此时t就属于新建状态当新建状态下的线程对象调用了start方法,此时从新建状态进入可运行状态.线程对象的start方法只能调用一次,否则报错:IllegalThreadStateException.

例如
Thread  t1=new Thread();

可运行(runnable)

分成两种子状态,ready和running。分别表示就绪状态和运行状态。

就绪状态

线程对象调用start方法之后,等待JVM的调度(此时该线程并没有运行),这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行,换句话说线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。

运行状态

线程对象获得JVM调度,如果存在多个CPU,那么允许多个线程并行运行

在这里插入图片描述

  • 被转换成Terminated状态,比如调用 stop() 方法;

  • 被转换成Blocked状态,比如调用了sleep, wait 方法被加入 waitSet 中;

  • 被转换成Blocked状态,如进行 IO 阻塞操作,如查询数据库进入阻塞状态;

  • 被转换成Blocked状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;

  • 该线程的时间片用完,CPU 再次调度,进入Runnable状态;

  • 线程主动调用 yield 方法,让出 CPU 资源,进入Runnable状态

例如
t1.start();
运行(running)他也从属于Runnable状态,但不在总体状态之内,属于逻辑状态机制

当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能,此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
在这里插入图片描述

注意:

在这里插入图片描述

Runnable状态的线程无法直接进入Blocked状态和Terminated状态的。只有处在Running状态的线程,换句话说,只有获得CPU调度执行权的线程才有资格进入Blocked状态和Terminated状态,Runnable状态的线程要么能被转换成Running状态,要么被意外终止。

堵塞(blocked)

正在运行的线程因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态.此时JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转到运行状态.阻塞状态只能先进入就绪状态,不能直接进入运行状态。

阻塞状态的两种情况:
  1. 当A线程处于运行过程时,试图获取同步锁时,却被B线程获取.此时JVM把当前A线程存到对象的锁池中,A线程进入阻塞状态.
  2. 当线程处于运行过程时,发出了IO请求时,此时进入阻塞状态.

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

在这里插入图片描述

  • 被转换成Terminated状态,比如调用 stop() 方法,或者是 JVM 意外 Crash;

  • 被转换成Runnable状态,阻塞时间结束,比如读取到了数据库的数据后;

  • 完成了指定时间的休眠,进入到Runnable状态;

  • 正在wait中的线程,被其他线程调用notify/notifyAll方法唤醒,进入到Runnable状态;

  • 线程获取到了想要的锁资源,进入Runnable状态;

  • 线程在阻塞状态下被打断,如其他线程调用了interrupt方法,进入到Runnable状态;

等待状态(waiting)

(等待状态只能被其他线程唤醒):

此时使用的无参数的wait方法,

  1. 当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中.
计时等待状态(timed waiting)

(使用了带参数的wait方法或者sleep方法)

  1. 当线程处于运行过程时,调用了wait(long time)方法,此时JVM把当前线程存在对象等待池中.
  2. :当前线程执行了sleep(long time)方法.
终止状态(terminated)

通常称为死亡状态,表示线程终止.

  1. 正常执行完run方法而退出(正常死亡).
  2. 遇到异常而退出(出现异常之后,程序就会中断)(意外死亡).
  3. JVM 异常结束,所有的线程生命周期均被结束。

线程一旦终止,就不能再重启启动,否则报错(IllegalThreadStateException).

不推荐使用的线程方法

在Thread类中过时的方法(因为存在线程安全问题,所以弃用了):

  • void suspend() :暂停当前线程
  • void resume() :恢复当前线程
  • void stop() :结束当前线程

给大家结合官网在进行一个中文解释的状态流转图:
在这里插入图片描述

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

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

相关文章

17. 电话号码的字母组合

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits …

R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例

全文下载链接&#xff1a;http://tecdat.cn/?p21317本文提供了运行分布滞后非线性模型的示例&#xff0c;同时描述了预测变量和结果之间的非线性和滞后效应&#xff0c;这种相互关系被定义为暴露-滞后-反应关联&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。…

C语言文件操作

目录序言文件程序文件&数据文件程序文件数据文件文本文件&二进制文件文件名操作初阶打开&关闭文件fopen读写文件fputc & fgetc文件缓冲区文件指针操作进阶打开方式"w"(只写)"r"(只读)"a"(追加)文件的顺序读写fgets & fputsf…

Mac安装rabbitmq延迟队列插件

Mac安装rabbitmq延迟队列插件我是通过brew安装的rabbitmq&#xff0c;没有安装Homebrew的需要安装一下查看我们rabbitmq版本&#xff0c;我这里的版本是3.11.3&#xff0c;我们下载的插件大版本必须是3.11 brew info rabbitmq下载rabbitmq_delayed_message_exchange插件&#…

虹科分享 | 终端安全防护 | 网络安全术语列表(终篇)

如果你的工作或者生活与网络安全有关&#xff0c;你就知道它使用了自己独特的、不断发展的语言。术语和缩略语受到网络安全专家的喜爱。因此&#xff0c;我们创建了一个全面的网络安全词汇表&#xff0c;解释了常用的网络安全术语、短语和技术。我们设计此列表是为了揭开安全专…

春夏秋冬-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第89讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

[附源码]计算机毕业设计springboot车险销售管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MySQL软件常见操作

1登录MySQL 登录&#xff0c;如果你配置了环境变量就可以winr&#xff0c;在运行框输入cmd&#xff0c;输入登录命令 第一种&#xff1a;直接输入密码 mysql -uroot -p(你的密码没有有括号) 第二种不直接输入密码 mysql -uroot -p 前面两种都是localhost登录 下面是完整版 m…

流媒体传输 - RTSP 协议认证过程

Rtsp 认证 主要分为两种&#xff1a; 基本认证 &#xff08;Basic authentication&#xff09;和 摘要认证 &#xff08;Digest authentication&#xff09; 基本认证是 HTTP 1.0 提出的认证方案&#xff0c;其消息传输不经过加密转换因此存在严重的安全隐患。 摘要认证是 H…

[附源码]计算机毕业设计springboot房屋租赁信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Spring Boot 实现万能文件在线预览-开源学习一

Spring Boot 实现万能文件在线预览-开源学习一 1. 项目特性 支持word excel ppt&#xff0c;pdf等办公文档支持txt,java,php,py,md,js,css等所有纯文本支持zip,rar,jar,tar,gzip等压缩包支持jpg&#xff0c;jpeg&#xff0c;png&#xff0c;gif等图片预览&#xff08;翻转&am…

Linux信号基础

目录 一&#xff0c;信号的产生 1&#xff0c;终端按键 2&#xff0c;调用系统函数向进程发送信号 (1)、kill:给指定的进程发送指定的命令 (2)、raise:自己给自己发信号 ​(3)、abort&#xff1a;让当前进程收到信号异常终止 3,由硬件产生 (1)、比如除零错误&#xff0c…

Shiro框架

权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;用户可以访问而且只能访问自己被授权的资源。权限管理几乎出现在任何系统里面&#xff0c;只要有用户和密码的系统。 很多人常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混…

Vue2 中使用“全局事件总线“实现任意组件间通信

前言&#xff1a; vue 中组件间通信的方式有很多 ------ 父传子propos&#xff0c;全局事件总线&#xff0c;消息订阅&#xff0c;vuex......等等&#xff0c;这篇文章带大家学习一下通过全局事件总线来实现任意组件间的通信。 文章目录&#xff1a; 一&#xff1a;什么是全局…

细节决定成败,Qlik数据洞察如何助力SEB化身“鹰眼”?

“随业务版图扩张&#xff0c;目前公司需要处理的数据集海量增长&#xff0c; SEB 的数据分析面临着越来越大的挑战&#xff0c;光是等待数据集计算的时间&#xff0c;都需要等待半天&#xff0c;效率低下导致我们很多工作都无法开展&#xff0c;我们需要一款更高效的 BI 工具”…

普元中间件Primeton AppServer6.5安装(Windows)

本文在Windows环境下安装普元中间件Primeton AppServer6.5&#xff08;以下简称PAS&#xff09; 一、安装前准备 1.1使用软件版本 Primeton_AppServer_6.5_Enterprise_Editio&#xff08;Windows&#xff09; 1.2安装前注意注意的点 1.需要提前安装JDK&#xff0c;并配置J…

神经网络和深度学习-加载数据集DataLoader

加载数据集DataLoader Dataloader的概念 dataloader的主要目标是拿出Mini-Batch这一组数据来进行训练 在处理多维特征输入这一文章中&#xff0c;使用diabetes这一数据集&#xff0c;在训练时我们使用的是所有的输入x&#xff0c;在梯度计算采用的是随机梯度下降&#xff08…

本地启动springboot项目失败端口问题

异常关键字&#xff1a; Cannot assign requested address: bind 排查结果 配置了环境变量【SERVER_ADDRESS】 网上搜了有的回答是端口占用&#xff0c;是不对的&#xff0c;端口占用的异常是这个【Web server failed to start. Port 8282 was already in use.】 排查结果…

麦芽糖-聚乙二醇-阿霉素maltose-Doxorubicin

麦芽糖-聚乙二醇-阿霉素maltose-Doxorubicin 中文名称&#xff1a;麦芽糖-阿霉素 英文名称&#xff1a;maltose-Doxorubicin 别称&#xff1a;阿霉素修饰麦芽糖&#xff0c;阿霉素-麦芽糖 还可以提供PEG接枝修饰麦芽糖&#xff0c;麦芽糖-聚乙二醇-阿霉素,Doxorubicin-PEG-…

无线传感器网络:定位、安全与同步

文章目录LocalizationRanging TechniquesReceived Signal Strength (RSS)Time of Arrival (ToA)Time Difference of Arrival (TDoA)Angle of Arrival (AoA)Range-Based Localization ProtocolsTriangulationTrilaterationIterative and Collaborative MultilaterationSecurityC…