一、详细介绍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. 芯片半导体基础(二) :20世纪最伟大的发明,PN结与晶体二极管

    liwen01 2025.01.12 前言 PN结 是晶体管的基础,它使得晶体管能够作为一个放大或是开关元器件.晶体管的发明不仅是一个技术上的突破,也标志着电子学的一个新时代.它极大地推动了科技和社会 ...

  2. 安全可信 | 通过双项测试!TeleDB实力亮剑!

    近日,天翼云TeleDB数据库在中国信通院"可信数据库"系列测试的赛道上,一次性跨越"分布式事务型数据库基础能力测试"与"性能测试"的双重大 ...

  3. 通过Ollama本地部署DeepSeek R1以及简单使用

    本文介绍了在Windows环境下,通过Ollama来本地部署DeepSeek R1.该问包含了Ollama的下载.安装.安装目录迁移.大模型存储位置修改.下载DeepSeek以及通过Web UI来对话 ...

  4. 微信小程序实现分类菜单激活状态随列表滚动而自动切换效果详解

    这篇文章主要介绍了微信小程序分类菜单激活状态跟随列表滚动自动切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧 目录 view结构 ...

  5. 给大模型添加联网功能的免费方案,以langchain为例

    langchain介绍 LangChain 是一个用于开发由大型语言模型 (LLM) 驱动的应用程序的框架. 简单来说,它可以帮助你更轻松地构建利用 LLM(例如 OpenAI 的 GPT 模型.Go ...

  6. TIDB 数据库架构概述

    学习目标 题解数据库整体架构 了解 TiDB Server .TiKV.TiFlash.和 PD 的主要功能 文章末尾获取笔记.视频资料,持续更新 体系架构 水平扩容或者缩容 金融级高可用 实时 HT ...

  7. 第二课 - 输入(按键)控制输出(LED)-设备树

    在第一课中学习了如何安装NCS开发环境,以及如何新建一个工程,还有如何构建和下载到开发板.并运行了官方的LED闪烁例程. 设备树 我们继续跟着官方开发者学院的教程来学习第二课的课程.官方课程包含了以下 ...

  8. springboot 2.1.6.RELEASE整合Swagger2

    一.引入依赖 1 <modelVersion>4.0.0</modelVersion> 2 <groupId>com.badcat</groupId> ...

  9. 阿里云Windows server 2016服务器Antimalware Service Executable进程占比高,cpu接近100%,强制关闭该进程实测

    问题描述:阿里云Windows server 2016服务器Antimalware Service Executable进程占比高,cpu接近100%,需要强制关闭该进程,排查问题,进入系统服务关闭, ...

  10. 【Pre】Exercise Log

    Pre2 #Task1 测评机(Java8)不支持enhanced Switch. Switch中,将case后的:改为->后,将会取消fall through,可以删去break; #Task ...