首页 > 编程语言 >JUC源码讲解:线程状态转换

JUC源码讲解:线程状态转换

时间:2024-03-12 20:34:53浏览次数:20  
标签:JUC RUNNABLE Thread 状态 Object 源码 线程

JUC源码讲解:线程状态转换

抛出问题

一个线程,有七种(也可以说是六种)状态,究竟是哪七种呢?在什么条件下,线程会进入一个状态,又在什么条件下,线程转而进入另一种状态呢?下面我们从源码角度看一下线程的状态转换

观察源码

我们进去 Thread.State.class 中,可以看到,线程状态由一个 enum 定义

感兴趣的朋友可以去看看源码的注释,写的很详细

public enum State {

        NEW,

        RUNNABLE,

        BLOCKED,

        WAITING,

        TIMED_WAITING,

        TERMINATED;
    }

观察看到,enum中定义了六种状态,我们来解释一下 :

  • NEW: 实例化, 调用 Thread.start() 后,会进入 RUNNABLE 状态,然后...... -->

  • RUNNABLE: 运行。这里的 RUNNABLE 又可细分为 RUNNING(运行中)和 READY(就绪)两种状态,这两种状态一直在相互转换,详见 -->

    • RUNNING: 运行中。当线程已经获取到了CPU时间片时,会呈现出这个状态,当没有被分配到CPU时间片或调用了 yield(), 会进入 READY 状态 -->
    • READY:就绪,当线程没有获取到CPU时间片、或在RUNNING时调用了 yield(),会呈现出这个状态。当获取了CPU时间片时,会回转移到 RUNNING 状态 <--
  • BLOCKED:阻塞。进入加锁的代码块会阻塞,注意,只有 sync 才会导致线程进入这个状态,其他的锁lock锁并不会!

  • WAITING:等待。线程在 RUNNABLE 状态中使用 Object.wait(), Thread.join(), LockSupport.partk() 会使线程进入这个状态,当使用 Object.notify(), Object.notifAll(), LockSupport.unpark(Thread) 释放,又会返回到 RUNNABLE 状态。注意,为什么 join() 可以用 notify(), notifyAll() 释放呢?因为 joint() 源码里用的其实就是 notify() !

  • TIMEED_WAITING: 超时等待。当使用 Thread.sleep(long), Object.wait(long), Thread.join(long), LockSupport.parkNanos(), LockSupport.partUntil() 时会进入这个状态,使用 Object.notify(), Object.notifyAll(), LockSupport.unpark(Thread) 释放后会回到 RUNNABLE 状态

  • TERMINTED: 终止。执行完成

好了,以上这段文字就是对七个线程状态的解释,他们是什么作用,如何相互转换的,解释的非常详细了,源码中写的也比较详细,注意一下我提到的那几点就可以了

总结

在Thread.State.class 中,线程用 enum 被定义为六种状态,而之所以说线程有七种状态的原因是,其中的 RUNNABLE 又可以细分为 READY 和 RUNNING 两种状态,这是因为考虑到一些线程没有争抢到CPU时间片而细分出的两种状态,这两种状态是在互相转换的,他们都属于 RUNNABLE

以上就是对线程七种状态的详细解读了,希望大家有所收获

感谢B站up 河北王校长 的知识分享

标签:JUC,RUNNABLE,Thread,状态,Object,源码,线程
From: https://www.cnblogs.com/acdongla/p/18069162

相关文章

  • Python基于微博的舆论分析,舆论情感分析可视化系统(V5.0),附源码
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • pdf.js源码解析-PDF文件的结构
    为了了解pdf.js源码的详细结构和功能,先来看看PDF的文件结构,然后才能知道pdf.js中的代码是如何解析并且为何这样操作PDF文件的。PDF文件基本是由header、body、trailer组成。header包含了这个PDF的信息,比如PDF的版本,创建时间,以及作者等。body包含了PDF文件的实际内容,比如文本,图片,......
  • Hive-源码分析一条hql的执行过程
    一、源码下载 下面是hive官方源码下载地址,我下载的是hive-3.1.3,那就一起来看下吧https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-src.tar.gz二、上下文<Hive-源码带你看hive命令背后都做了什么>博客中已经讲到了hive命令执行后会一直循环处理控制台输入的hq......
  • 【短剧小程序开发】费用从20元送源码到20万定制到底有什么区别?
    网络微短剧无疑是2024年最火热的蓝海项目之一。2023年国内微短剧总量已达373.9亿元,可知道全年电影总票房才549亿元。短剧的市场总量超过电影票房指日可待,预计2027年短剧总量可达1000亿元。稍微关注短剧赛道的朋友就会发现,23年至今不断会有某某短剧上线当日充值超2000万等等新......
  • 多线程系列(十七) -线程组介绍
    一、简介在之前的多线程系列文章中,我们陆陆续续的介绍了Thread线程类相关的知识和用法,其实在Thread类上还有一层ThreadGroup类,也就是线程组。今天我们就一起来简单的聊聊线程组相关的知识和用法。二、什么是线程组线程组,简单来说就是多个线程的集合,它的出现主要是为了更方便的......
  • 如何在Visual Studio中调试.NET源码
    今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。我一般的做法是先判断是否为null,再判断Count。看了一下Count的源码如下:1[__DynamicallyInvokable]2publicintCount3{4[__DynamicallyInvokable]5get6......
  • RocketMQ为什么这么快?我从源码中扒出了10大原因!
    大家好,我是三友~~RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快那么,问题来了,RocketMQ为什么这么快呢?接下来,我将从以下10个方面来探讨一下RocketMQ这么快的背后原因如果你对RocketMQ还不了解,可以从公众......
  • 深入浅出Java多线程(十一):AQS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer)。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代多核CPU环境中,多线程编程已成为提升系统性能和并发处理能力的关键手段。然而,当多个线程共享同一资源......
  • RocketMQ为什么这么快?我从源码中扒出了10个原因!
    大家好,我是三友~~RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快那么,问题来了,RocketMQ为什么这么快呢?接下来,我将从以下10个方面来探讨一下RocketMQ这么快的背后原因如果你对RocketMQ还不了解,可以从公众......
  • 自己简单实现一个线程池
    线程池Java中的线程池是运用最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。线程池的好处/作用:1.不需要频繁的创建和销毁线程,提高相应速度2.管理线程,避免无休止的创建线程导致资源枯竭。(不会每来一个任务就创建一个线程,线程不断的取任务执行)线程池......