一、详细介绍java的线程池状态

Java 中的线程池状态是 ThreadPoolExecutor 类内部管理的一个重要概念。线程池的状态决定了线程池的行为,例如是否接受新任务、是否处理队列中的任务、是否中断正在执行的任务等。

线程池的状态通过一个 AtomicInteger 变量(ctl)来表示,该变量同时存储了线程池的状态和线程数量

1、线程池状态的表示

ThreadPoolExecutor 使用一个 32 位的 AtomicInteger 变量(ctl)来同时表示线程池的状态和线程数量

  • 高 3 位:表示线程池的状态。

  • 低 29 位:表示线程池中的线程数量。

2、线程池的五种状态

线程池的状态包括以下五种:

2.1、RUNNING(运行状态)

  • 值:11100000 00000000 00000000 00000000(十进制:-536870912)

  • 描述:

    • 线程池处于正常运行状态。

    • 可以接受新任务并处理队列中的任务。

  • 触发条件:线程池初始化时默认处于 RUNNING 状态

2.2、SHUTDOWN(关闭状态)

  • 值:00000000 00000000 00000000 00000000(十进制:0)

  • 描述:

    • 线程池不再接受新任务。

    • 但会继续处理队列中的任务。

  • 触发条件:调用 shutdown() 方法。

2.3、STOP(停止状态)

  • 值:00100000 00000000 00000000 00000000(十进制:536870912)

  • 描述:

    • 线程池不再接受新任务。

    • 不再处理队列中的任务。

    • 会中断正在执行的任务。

  • 触发条件:调用 shutdownNow() 方法。

2.4、TIDYING(整理状态)

  • 值:01000000 00000000 00000000 00000000(十进制:1073741824)

  • 描述:

    • 任务全执行完毕,活动线程为 0 即将进入终结。

    • 即将调用 terminated() 方法。

  • 触发条件:

    • 当线程池从 SHUTDOWN 状态变为空(队列为空且线程数量为 0)时。

    • 当线程池从 STOP 状态变为线程数量为 0 时。

2.5、TERMINATED(终止状态)

  • 值:01100000 00000000 00000000 00000000(十进制:1610612736)

  • 描述:

    • 线程池完全终止。

    • terminated() 方法已执行完毕。

  • 触发条件:terminated() 方法执行完成后。

3、线程池状态的转换

线程池的状态转换遵循以下规则:

3.1、RUNNING -> SHUTDOWN:

  • 调用 shutdown() 方法。

  • 不再接受新任务,但会处理队列中的任务。

3.2、RUNNING/SHUTDOWN -> STOP:

  • 调用 shutdownNow() 方法。

  • 不再接受新任务,不再处理队列中的任务,并中断正在执行的任务。

3.3、SHUTDOWN -> TIDYING:

  • 队列为空且线程数量为 0。

3.4、STOP -> TIDYING:

  • 线程数量为 0

3.5、TIDYING -> TERMINATED:

  • terminated() 方法执行完毕

4、线程池状态的源码分析

以下是 ThreadPoolExecutor 中与线程池状态相关的源码片段:

4.1 状态常量

4.2 状态判断方法

状态对比:RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED

private static boolean isRunning(int c) {
return c < SHUTDOWN;
}

isRunning方法的作用是判断传入的整数 c 是否小于 SHUTDOWN。如果 c 小于 SHUTDOWN,则认为线程池正在运行,返回 true;否则返回 false

private static boolean isStopped(int c) {
return c >= STOP;
}

isStopped方法的作用是判断传入的整数 c 是否大于或等于 STOP。如果 c 大于或等于 STOP,则认为线程池已经停止,返回 true;否则返回 false

private static boolean isTerminated(int c) {
return c >= TERMINATED;
}

isTerminated方法的作用是判断传入的整数 c 是否大于或等于 TERMINATED。如果 c 大于或等于 TERMINATED,则认为线程池已经终止,返回 true;否则返回 false

4.3 状态转换方法

5、线程池状态的应用

5.1、判断线程池是否运行中

5.2、关闭线程池

5.3、等待线程池终止

详细介绍java的线程池状态的更多相关文章

  1. Java - "JUC线程池" 线程状态与拒绝策略源码分析

    Java多线程系列--“JUC线程池”04之 线程池原理(三) 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基本概念"中,我们介绍过,线程有5种状态:新建 ...

  2. juc线程池原理(四): 线程池状态介绍

    <Thread之一:线程生命周期及五种状态> <juc线程池原理(四): 线程池状态介绍> 线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态.线程池也有5种状态 ...

  3. Java线程池状态和状态切换

    摘要 介绍线程池的五种状态RUNNING.SHUTDOWN.STOP.TIDYING和TERMINATED,并简述五种状态之间的切换.   在类ThreadPoolExecutor中定义了一个成员变量 ...

  4. 【Java多线程】线程状态、线程池状态

    线程状态: 线程共包括以下5种状态.1. 新建状态(New) 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable) 也 ...

  5. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  6. Java中线程池的学习

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...

  7. 深入理解Java之线程池(爱奇艺面试)

    爱奇艺的面试官问 (1) 线程池是如何关闭的 (2) 如何确定线程池的数量 一.线程池销毁,停止线程池 ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown() ...

  8. [转]深入理解Java之线程池

    原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...

  9. Java并发--线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  10. Java之线程池(一)

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

随机推荐

  1. Spring Cloud认知学习(一)--Eureka使用、Ribbon使用

    Spring Cloud是一个微服务架构,他有多种组件来管理微服务的方方面面.Spring Cloud是用于构建微服务开发和治理的框架的集合. Spring Cloud是最热门的Java技术毋庸置疑. ...

  2. 深入解析 Spring AI 系列:分析 Spring AI 可观测性

    今天我们将讨论之前略过的可观测性部分的代码.在这里,我想简单说明一下,当时这部分代码属于必须编写的固定模板,因此在最初的讨论中我们直接跳过了它.虽然这部分代码乍看之下可能显得比较复杂,但实际上它的核心 ...

  3. Linux:yum

    yum介绍 [yellow dog updater,modified],一个在Fedora和RedHat以及SUSE.Centos中的shell前段软件包管理器 能够自动的从指定的服务器自动下载RPM ...

  4. 牛客 acm输入输出模式练习

    https://www.nowcoder.com/exam/test/67432019/detail?pid=27976983#question 注意:只有部分个人觉得有意义的题目 A+B(4) 计算 ...

  5. react之state两种不同的写法

    我发现 state 有两种不同的写法 在构造器 constructor 中是这样的 有 this. constructor(props){//参数必须要有 super(props); this.sta ...

  6. MacOS修改应用快捷键的一般思路

    具体步骤为: 使用CheatSheet软件查看菜单项名称 在系统设置中修改菜单项的快捷键 举个例子:修改Chrome中左右切换tab的快捷键(系统语言为英文,中文同理) 默认采用Ccontrol Ta ...

  7. 阿里的DataV和QuickBi区别

    首先说下DataV吧 分为老版和新版(二者之间没有什么太大的差别,存在的基本都是组件上的配置或是更多不同组件的新增,但是如果你是在项目上进行开发,你首先要知道客户用的DataV用的是什么版本,如果你们 ...

  8. GIS矢量数据获取:全球行政区划、路网、POI点、建筑物范围、信号基站等

      本文对目前主要的行政区边界与道路路网.建筑轮廓.POI.手机基站等数据产品的获取网站加以整理与介绍. 目录 5 行政区边界与建筑轮廓.POI.基站数据 5.1 行政区边界数据 5.1.1 DIVA ...

  9. Luogu P4588 数学运算 题解 [ 绿 ] [ 线段树 ]

    Luogu P4588 数学运算. 虽然是一个很典的题,但里面的思想还是比较值得记录的. 假做法 一开始看到此题还以为是乘法逆元的模板题,但看到 \(m\) 与 \(M\) 不互质,就知道这种做法是假 ...

  10. docker容器内部添加字体

    1.首先在windows电脑内找到字体拷贝到linux服务器,路径 C:\Windows\Fonts,linux的路径 /usr/share/fonts 2.复制到docker容器内部 docker ...