一、详细介绍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. 计算困难假设(Computational hardness assumption)

    以下内容翻译自:维基 介绍 在计算复杂性理论中,计算困难假设是一个特定问题无法得到有效解决的假设(有效通常指"在多项式时间内").目前还不知道如何证明其困难性.同时,我们可以将一个 ...

  2. [Java] Solon 框架的三大核心组件之一插件扩展体系

    1.Solon 的三大核心组件 核心组件 说明 Plugin 插件扩展机制 提供"编码风格"的扩展体系 Ioc/Aop 应用容器 提供基于注入依赖的自动装配体系 Context+H ...

  3. DeepSeek本地安装部署(指南)

    前言 这两天deepseek出圈了. 今天分享一下,如果在本地电脑部署和运行deepseek,实现AI对话的功能. 访问ollama官网: https://ollama.com/ 下载一个合适自己操作 ...

  4. 智算引领 AI启航,中国电信天翼云助推辽宁数智发展!

    近日,中国电信辽宁公司"智算引领 AI启航"新质生产力赋能辽宁新时代"六地"建设大会在沈阳圆满落幕.辽宁省工业和信息化厅,省国资委,省数据局,省农业农村厅,沈阳 ...

  5. 基于Java语言的开源能管平台才是最适合国内的能源管理平台

    在"双碳"战略背景下,能源管理已成为政府.企业实现可持续发展的必经之路.面对市场上各类能源管理平台,为何基于Java语言的开源解决方案才是最佳选择?本文将为您揭晓答案,并向您推荐我 ...

  6. FreeSql学习笔记——11.LinqToSql

    前言   Linq的强大大家有目共睹,可以以简便的方式对数据集进行复杂操作,LinqToSql经常使用在数据库的联表.分组等查询操作中:FreeSql对LinqToSql的支持通过扩展包FreeSql ...

  7. 【计算机】常见CPU指令集发展及其关系

    [计算机]常见 CPU 指令集发展及其关系 CPU 与指令集 任何计算机都有一块 CPU,CPU 有其支持的指令集,根据指令集间的兼容性,一种 CPU 可能同时支持多种指令集. 指令集中记录了 CPU ...

  8. Git 远程仓库地址修改了怎么办?

    项目迁移了一波仓库地址,从自建的git-lab到gitee,所以远程仓库地址发生了变更. 命令: git remote -v # 查看本地配置的远程仓库地址,针对下图中的origin,有的人起名字可能 ...

  9. 刷入Magisk错误:1教程

    面具是目前使用最多的授权APP了,兼容主流安卓版本,基本上已彻底的替代的之前的supersu授权,面具magisk不仅支持给APP进行授权ROOT,还支持隐藏root功能magiskhide,使得手机 ...

  10. Hive - [02] 安装部署

    一.相关链接地址 Hive官网:https://hive.apache.org/ Hive下载页面:https://downloads.apache.org/hive/ 中科大镜像地址:http:// ...