JAVA线程状态详解

JAVA多线程详解(超详细) 程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和指令集,是一个静态的概念。进程(Process):将程序运行起来,我们称之为进程。进程是执行程序的一次执行过程,它是动态的概念。进程存在生命周期,也就是说程序随着程序的终止而销毁。进程之间是通过TCP/IP端口实现交互的。线程(Thread):线程是进程中的实际运作的单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程。线程是CPU调度和执行的最小单位。注意。 阅读详情

Java中线程状态源码

java包位置:java.lang.Thread.State(Thread的内部枚举类)

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;
    }

Java中线程状态(六种)

1.NEW

新建状态,表示一个Thread刚刚被创建出来,还没有启动

2.RUNNABLE

运行状态,表示线程处于JVM层面的运行态。一个新创建好的线程,调用其start()方法后,就会由NEW状态迁移到RUNNABLE状态。需要注意的是:这里的RUNNABLE是相对于JVM的状态来说的,而线程具体何时运行,取决于操作系统底层的资源调度。

3.BLOCKED

阻塞状态,表示线程正在等待一个监视器锁(monitor lock),而监视器锁在Java代码中的体现就是synchronized关键字。也就是说:只有线程在等待进入synchronized修饰的代码块或方法时,线程才处于BLOCKED状态。

4.WAITING

处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

等待状态,表示线程在等待某些条件的到达。在调用以下方法后,线程会进入WAITING状态:
Object中定义的无超时的wait()方法,等待一个同步监视器的唤醒;
Thread中定义的无超时的join()方法,等待其他线程执行完毕;
LockSupport.park()方法。

5.TIMED_WAITING

处于这种状态的线程不会被分配CPU执行时间,不会无线等待,在达到一定时间后它们会自动唤醒。

超时等待状态,与WAITING状态类似,并在其基础上,增加了超时的限制。在调用以下方法后,线程会进入TIMED_WAITING状态:
Thread.sleep()方法,线程定时休眠;
Object中定义的带超时的wait()方法;
Thread中定义的带超时的join()方法;
LockSupport.parkNanos()方法;
LockSupport.parkUntil()方法。

6.TERMINATED

终止状态,包括线程正常执行完毕和异常终止。

Linux系统的线程状态(这块内容过于复杂仅供参考)

先简单谈谈CPU的调度(仅供参考,因为没对操作系统进行细致的研究)

  1. 如果线程完全在内核态中实现(内核线程,KLT),内核调度的单元是线程。此时,进程与线程的区别非常微妙。
  2. 如果线程完全在用户态实现(用户线程,ULT),内核调度的单元是进程,内核对用户线程一无所知。内核只负责分配CPU给进程,进程得到CPU会后再分配给内部的线程

进程的状态

运行态(此进程实际占用CPU)

就绪态(可运行,但因其他进程正在运行而暂时停止)

阻塞态(除非某种外部事件发生,否则进程不能运行)

操作系统线程状态与JVM线程状态区别

上面介绍了操作系统线程状态其实就想说明一下一些问题:

  1. JAVA中的六种线程状态是相对于JVM而言的,与操作系统无关。之所以定义这些状态是为了从JVM层面来管理线程
  2. 说一下JAVA线程的RUNNABLE状态,从字面意思来讲是“可运行的”,但实际上,假如线程处于RUNNABLE状态,对应的线程是否被CPU调度,JVM是不知道的,不关心的,不透明的。即从CPU来讲该线程可能是“阻塞态”、“运行态”、“就绪态”,这里的状态并非JVM状态。

JAVA线程状态与占用CPU关系

  1. 仅有线程状态为RUNNABLE时,才可能占用CPU,这里是可能,但其实从JVM层面来讲,RUNNABLE就是在占用CPU资源,从操作系统层面来讲,RUNNABLE可能再占用CPU资源,这可能很矛盾,但这是每个层面的视角不同而已。
  2. 非RUNNABLE状态,一定不占用CPU资源

JAVA线程相关方法与线程状态、锁的关系

Thread.sleep(long millis)方法

方法作用: 延时、阻塞
线程状态: TIMED_WAITING
锁特点: 不释放锁
代码块: 阻塞代码块

Thread.yield()方法

方法作用: 通知操作系统底层,放弃当前的CPU时间片,yield也可以理解为线程让步,但并非绝对让步,依然需要根据线程调度优先级来决定。个人感觉,这个方法的使用场景更像是在一些当前线程高度占用CPU时,均衡一些次要线程的调度。
线程状态: RUNNABLE
锁特点: 不释放锁
代码块: 不阻塞

obj.wait()/obj.wait(long millis)方法

方法作用: 使线程等待,依靠notify()/notifyAll()唤醒或者wait(long timeout) timeout时间到自动唤醒。
线程状态: WAITING/TIMED_WAITING
锁特点: 释放锁
代码块: 阻塞.

thread.join()/thread.join(long millis)方法

方法作用: 线程A执行了thread.join()语句,其含义是:当前线程A等待thread线程终止之后才从thread.join()返回
线程状态: WAITING/TIMED_WAITING
锁特点: 不释放锁
代码块: 阻塞

obj.notify()方法

方法作用: 唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。
线程状态: RUNNABLE
锁特点: 不释放锁
代码块: 不阻塞

LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines)方法

方法作用: 不需要获得锁就可以让线程进入WAITING/TIMED_WAITING状态,LockSupport.unpark(Thread thread)唤醒
线程状态: WAITING/TIMED_WAITING
锁特点: 不需要获得锁就可以让线程进入等待态
代码块: 不阻塞

参考文献:Java线程的6种状态及切换(透彻讲解)

java线程的五大状态详解 一个线程的生命周期里有五大状态,分别是:1、新生2、就绪3、运行4、死亡5、运行后可能遇到的阻塞状态。 阅读详情

相关推荐

Java 解析线程的几种状态详解

从操作系统层面上,任何线程一般都具有五种状态,即创建、就绪、运行、阻塞、终止。在程序中用构造方法创建一个新线程时,如new Thread(),该线程就是创建状态,此时它已经有了相应的内存空间和其它资源,但是还没有开始执行。新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程就进入就绪状态(runnable)由于还没有分配CPU,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件。当系统挑选一个等待执行的Thread对象后,它就会从等待状态进入执行状态。

m0_73311735的博客 1474

编程必备:JAVA多线程详解

多线程已经成为一种常见的编程模式,广泛应用于各种不同类型的应用程序中。本篇博客文章中,我们将会探讨多线程编程的相关知识和技巧。通过代码示例和实际应用案例来深入了解多线程的具体实现和应用方法,帮助更好地掌握多线程编程技术,提高程序效率和性能。后期随学习深入还会补充修改。以上就是我对多线程的个人简介,后续会不断完善更新,与大家共勉。

拾一二的博客 9424

java线程状态图

java线程从新建到死亡所能经历的各种状态之间的流转。包括运行到阻塞、进入锁池、等待队列,全面而清晰的一张图

Java线程的六种状态(付代码解释)

Java线程一共有六种状态,分别是新建状态(New)运行状态(Runnable)阻塞状态(Blocked)等待状态(Waiting)计时等待状态(Timed Waiting)终止状态(Terminated)

qq_62718027的博客 1790

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

eNSP-抓包解析TCP三次握手和四次挥手的过程

一、环境搭建 1.设备连接 2.服务器配置 3.客服端配置 二、抓包测试 1.打开抓包软件 2.客户端获取数据 三、抓包结果

小橙子的博客 3348

Java线程状态(超详细)

当我们在编写多线程程序时,了解线程状态是非常重要的,因为它能够帮助我们理解线程在执行过程中的行为,从而更好地控制和管理线程。

小电玩 1273

树莓派与ROS2

树莓派与ROS2(Robot Operating System 2)的结合使用为机器人开发、自动化控制以及物联网项目提供了强大的平台。

weixin_47695827的博客 1754

线程的五种状态

1)新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行; 3)运行状态(Running):当CP...

qq_37119960的博客 925

什么是 WhatsApp云控 WhatsApp群发,WhatsApp协议,他们有什么区别?

下面我们sensws讲解下什么是WhatsApp云控 WhatsApp群发,WhatsApp协议

sendws的博客 3874

C51:PWM+舵机角度控制

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.脉冲宽度调制通过占空比编码模拟信号一个周期内,高电平占据时长的百分比如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。

qq_73379310的博客 3388

Java 线程状态详解

本文详细解析了 Java 线程的 6 种状态 — 新建、运行、阻塞、等待、定时等待和终止,以及这些状态之间的切换过程。通过示例代码和图解,帮助读者更好地理解线程状态及其转换过程。掌握这些知识,有助于我们在实际开发中更好地控制和管理线程。

专注Java和MySQL领域知识分享 1685

YOLOv11改进 | 注意力篇 | YOLOv11引入24年动态卷积块注意力(Dynamic-CBAM),并构建C2PSA_DynamicCBAM

1.Dynamic-CBAM介绍1.1 摘要:重度抑郁症是一种普遍而严重的心理健康状况,对您的情绪,思想,行动和对世界的整体感知产生负面影响。由于抑郁症的症状不明显,确定一个人是否抑郁是很复杂的。然而,他们的声音可能是我们可以识别抑郁症迹象的因素之一。抑郁的人会表现出不适、悲伤,他们可能说话缓慢、颤抖,声音中失去情感。在这项研究中,我们提出了动态卷积块注意力模块(DynamicCBAM),用于在注意力-GRU网络中通过分析人类的音频信号来分类情感。

tsg6698的博客 1001

java 线程 状态 详解

java 线程 状态 详解

T_Y_F_的博客 1052

【光子 AI 】应用 LangGraph 的核心模型和算法原理,完整实现一个极简版的 Agent 开发框架源代码,并给出具体的应用测试实际项目案例

下面给出一个“极简版 LangGraph 风格 Agent 框架”的完整可运行实现:用 有向图 + 状态(State) + 节点(Node) + 条件路由(Conditional Edge) + 循环(Loop) + Checkpoint 这一套核心模型/算法,把 Agent 组织成可编排、可测试的状态机工作流(这正是 LangGraph 的核心抽象之一:以 StateGraph 组织节点,节点读写共享状态,边做路由与循环,并支持持久化/回放)。 参考概念来源:LangGraph 官方文档对 “StateG

AI天才研究院 267

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java线程状态详解

java线程的六种状态详解

2302_80683230的博客 1431

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java线程状态详解

java的线程状态,线程的迁移,以及其原理

qq_58876428的博客 1232

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【线程】java线程的6种状态详解

线程的5种状态详解

m0_45406092的博客 438

Java线程的几种状态详解

1.Java线程到底有几种状态? 有人说是五种(新建、就绪、运行、阻塞、死亡),计算机网络里面讲的线程状态也是这五种,但java线程状态和计网里的线程状态真的一样吗?查阅很多资料,最终从java.lang.Thread.State的源码看到java线程的状态(早期单线程进程状态就是上面的五种) public enum State { /** * Thread state for a thread which has not yet started. *

gkkljy的博客 484

java线程状态详解与转换

System.out.println("线程状态: " + thread.getState());System.out.println("线程状态: " + thread.getState());System.out.println("线程状态: " + thread.getState());System.out.println("线程状态: " + thread.getState());当线程尝试进入一个被其他线程占用的同步代码块或方法时,线程会进入。:线程无限期等待其他线程的唤醒。

zhglhy的专栏 971

Java线程的6种状态详解及创建线程的4种方式

1、线程的定义 2、线程的6种状态及切换 3、线程的4种创建方式 4、线程相关常见面试题 1、线程的定义 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 2、线程6种状态及切换 Java中线程的状态分为6种,定义在Thread类的State枚举中。 public class Th

weixin_47661043的博客 1825

Java中6种线程状态详解

JAVA中6种线程状态 位于java.lang.Thread类中有个内部枚举State,定义了Java中6种线程状态,可以通过使用Thread的getState()获取线程状态 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, ...

十十办文武的博客 574
上一篇: html用原生锚点定位在vue中兼容页内锚点定位的简单方法
下一篇: vue-quill-editor 图片实现自定义服务器上传的简单方法
mt23
博客等级 码龄12年 33粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值