文章目录

  • 一、线程池状态分析

一、线程池状态分析


线程池的状态在 ThreadPoolExecutor 源码中定义 : private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)) 成员变量的 前 333 位是线程池的状态位 , 剩下的 292929 位是线程数 ;

public class ThreadPoolExecutor extends AbstractExecutorService {/*** 主池控制状态ctl是一个原子整数* 两个概念领域* workerCount,指示有效线程数* 运行状态,指示是否运行、关闭等* * 为了将它们打包成一个整数,我们将workerCount限制为* (2^29)-1(约5亿)个线程,而不是(2^31)-1(2* 10亿)否则可代表。如果这曾经是一个问题* 将来,变量可以更改为原子长度,* 下面的移位/遮罩常数已调整。但在需要之前* 因此,此代码使用int更快更简单。* * workerCount是已注册的工人数* 允许启动,不允许停止。该值可能是* 与活动线程的实际数量暂时不同,* 例如,ThreadFactory在以下情况下无法创建线程:* 当退出线程仍在执行时* 终止前的簿记。用户可见池大小为* 报告为工作集的当前大小。* * 运行状态提供主要的生命周期控制,具有以下值:* * 正在运行:接受新任务和处理排队的任务* 关机:不接受新任务,但处理排队的任务* 停止:不接受新任务,不处理排队的任务,* 并中断正在进行的任务* 整理:所有任务都已终止,workerCount为零,* 正在转换为状态整理的线程* 将运行终止的()钩子方法* 终止:终止()已完成* * 这些值之间的数字顺序很重要,以允许* 有序比较。运行状态随时间单调增加* 时间,但不需要击中每个状态。这些转变是:* * 运行->关机* 在调用shutdown()时,可能隐式地在finalize()中* (运行或关闭)->停止* 在调用shutdownNow()时* 关机->整理* 当队列和池都为空时* 停止->整理* 当池为空时* 清理->终止* 当终止的()钩子方法完成时* * 等待终止()的线程将在* 国家终止。* * 检测从关闭到清理的过渡较少* 比您希望的简单,因为队列可能会* 非空后为空,关机状态下为空,但* 只有在看到它是空的之后,我们才能终止* workerCount为0(有时需要重新检查——请参阅* 下)。*/private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));private static final int COUNT_BITS = Integer.SIZE - 3;private static final int CAPACITY   = (1 << COUNT_BITS) - 1;// runState is stored in the high-order bitsprivate static final int RUNNING    = -1 << COUNT_BITS;private static final int SHUTDOWN   =  0 << COUNT_BITS;private static final int STOP       =  1 << COUNT_BITS;private static final int TIDYING    =  2 << COUNT_BITS;private static final int TERMINATED =  3 << COUNT_BITS;// Packing and unpacking ctlprivate static int runStateOf(int c)     { return c & ~CAPACITY; }private static int workerCountOf(int c)  { return c & CAPACITY; }private static int ctlOf(int rs, int wc) { return rs | wc; }
}

简单的机翻了下 , 如果查看详细的英文注释 , 查看 libcore/ojluni/src/main/java/java/util/concurrent/ThreadPoolExecutor.java 源码 ;

RUNNING 状态 : 该状态下 可以接受新的 Runnable 任务 , 以及 处理阻塞队列中被添加的 Runnable 任务 ;

SHUTDOWN 状态 : 不接受新的 Runnable 任务 , 可以处理已经添加在阻塞队列中的 Runnable 任务 ;

STOP 状态 : 不接受新的 Runnable 任务 , 也不处理已经添加在阻塞队列中的 Runnable 任务 , 正在执行的任务也要中断 ;

TIDYING 状态 : 停止所有任务 , private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)) 变量设置为 000 ;

TERMINATED 状态 : 线程池彻底停止 ;

在 RUNNING 状态 , 调用 shutdown() 方法 , 跳转到 SHUTDOWN 状态 , 如果此时阻塞队列为空 , 线程池的工作线程为 000 , 就自动进入到 TIDYING 状态 ;
这里的工作线程指的是 核心线程 和 非核心线程 ;
线程池处于 RUNNING 状态下 , 正常运行 , 既可以处理新任务 , 也可以处理阻塞队列中的任务 ; 一旦调用 shutdown() 方法后 , 不再接受新任务 , 将阻塞队列中的残留任务执行完毕 , 然后进入 TIDYING 状态 ;

在 RUNNING 状态 , 调用 shutdownNow() 方法 , 跳转到 STOP 状态 , 此时强行将线程池的工作线程 ( 核心线程 和 非核心线程 ) 和 阻塞队列清空 , 处理完毕后 , 跳转到 TIDUING 状态 ;
也就是说 , 不等待当前正在执行的任务和阻塞队列中的任务执行完毕 , 立刻跳转到 TIDYING 状态 ;

在 TIDYING 状态下 , 一般是自动跳转到 TERMINATED 状态 ;

【Java 并发编程】线程池机制 ( 线程池状态分析 | 线程池状态转换 | RUNNING | SHUTDOWN | STOP | TIDYING | TERMINATED )相关推荐

  1. Java并发编程之锁机制之LockSupport工具

    关于文章涉及到的jdk源码,这里把最新的jdk源码分享给大家----->jdk源码 前言 在上篇文章<Java并发编程之锁机制之AQS(AbstractQueuedSynchronizer ...

  2. Java 并发编程(四):如何保证对象的线程安全性

    本篇来谈谈 Java 并发编程:如何保证对象的线程安全性. 01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中 ...

  3. Java并发编程实战读书笔记(一)——线程安全性、对象共享

    一.线程安全性 一个对象是否需要是线程安全的,取决于它是否被多个线程访问. 当多个线程访问,并且其中有一个执行写入时,必须采用同步机制,Java中主要的同步关键字是 synchronized 独占加锁 ...

  4. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  5. Java 并发编程—Synchronized关键字

    原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...

  6. Java 并发编程:Synchronized 及其实现原理

    作者:liuxiaopeng 原文链接: www.cnblogs.com/paddix/p/5367116.html 一.Synchronized的基本使用 Synchronized是Java中解决并 ...

  7. JAVA并发编程实践笔记

    2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法:     a, 不要跨 ...

  8. Java并发编程Future超详细教程

    非原创,自己保存学习用,传播请参考原文. 原文链接:Java并发编程Future超详细教程 前言 创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧 继承 Thread 类实现 Runnable ...

  9. Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 我国宋代禅宗大师青原行思在<三重境界>中有这样一句话:" 参禅之初 ...

最新文章

  1. Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
  2. vuerouter3种模式_Vue-router的三种传参方式
  3. windows下文件共享以及通过网线在两台Windows电脑之间传数据
  4. PS5独占游戏RETURNAL:华丽的黑暗电子声音是如何制作的(新 3D 音频引擎)下
  5. html5语异性元素,异性的5句性暗示
  6. 《史上最简单的 SpringCloud 教程》系列
  7. 4. 哪些视图中的数据不可以增删改操作?_MySQL之视图
  8. 修改docx表格_实例29_在Word表格中将上下行相同内容的单元格自动合并
  9. 别再说Python简单!
  10. MongoDB 安装与启动
  11. ”三不跳“ - 再说跳槽
  12. 从数据库查询数据并输出到前台页面
  13. LeetCode.199 二叉树的左视图
  14. Android 项目必备(二十九)-->App 在线升级与更新
  15. 2021最新Navicat15下载安装包
  16. 大疆无人机 Android 开发总结——视频解码
  17. 小啊呜产品读书笔记001:《邱岳的产品手记-11》第21讲 产品案例分析:Fabulous的精致养成
  18. 证书 Certificate
  19. sqlserver使用正则表达式
  20. Tableau 七、多边形地图和背景图地图:设置地理信息(自定义地图码导入、设置地图源)

热门文章

  1. STM32在定时器中控制步进电机
  2. python 线程指南
  3. ecshop“发货查询”中加入收货人、收货地址、发货时间、配送方式
  4. VIM编辑器使用技巧
  5. legend3---3、lavarel页面post请求错误之后跳转
  6. 04:网络层协议介绍
  7. Dinic最大流 || Luogu P3376 【模板】网络最大流
  8. java-统计字符串中各字符次数
  9. 递归--练习8--noi1788Pell数列
  10. 1191: 冰法斗神龙 暴力枚举