ThreadPoolExecutor源码剖析

news/2024/11/30 2:49:26/

ThreadPoolExecutor源码涉及到的内容比较多,需要一点点的去啃和查看…

ThreadPoolExecutor的核心属性

ThreadPoolExecutor的核心属性主要就是CTL。基于CTL获取到线程池的状态以及工作线程个数。

  • ctl是一个int类型的整数,內部基于AtomicInteger(原子整数)包装了一层,有点类似于装饰者模式,保证在进行运算时是原子性的。
  • ctl代表者线程中的两个核心的状态。分别是线程池的状态、工作线程的数量。
  • 线程池的状态:使用ctl的高3位表示
  • 工作线程的数量:使用ctl的低29位表示。
    在这里插入图片描述
  • private static final int COUNT_BITS = Integer.SIZE - 3:中COUNT_BITS是在获取位数。Integer.SIZE是整数类型的比特位数32位-3那就是29;
  • private static final int CAPACITY = (1 << COUNT_BITS) - 1:将1左移29位置-1那就是得到了最大的线程个数。
  • 00100000 00000000 00000000 00000000
  • 00000000 00000000 00000000 00000001
  • 00011111 11111111 11111111 11111111

// runState is stored in the high-order bits
private 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;

上述的5个private定义的是代表线程池的五大状态。其中只有RUNNING状态代表线程池可以正常接收任务。
  • RUNNING状态:-1左移29位得到的高三位是111。代表可以处理任务并且可以处理阻塞队列中的任务。
  • SHUTDOWN状态:高三位000,不会接收任务。但是正在处理的任务会正常进行,阻塞队列中的任务也会正常进行。
  • STOP状态:高三位001,不会接收新任务,正在处理任务的线程会被中断,阻塞队列中的任务不去处理。
  • TIDYING状态:高三位010,这个状态代表着从SHUTDOWN或者STOP状态转换过来。代表着线程池马上关闭但是还没有关闭。是一个过渡状态。
  • TERMINATED状态:高三位011,该状态是TIDYING状态转换而来,该状态只需要执行一个TERMINATED方法,这个方法需要自己去实现相关的业务逻辑。

在这里插入图片描述

private static int runStateOf(int c) { return c & ~CAPACITY; }
private static int workerCountOf(int c) { return c & CAPACITY; }

  • 上述两个方法显而易见需要ctl传递参数进来,涉及到并发需要实时获取准确值
  • runStateOf 是基于与运算。 ~CAPACITY是取反操作然后和c与运算。显而易见是只会会得到高3位的值
  • workerCountOf同理只会得到低29位的值,也就是获取到当前的工作线程个数。

http://www.ppmy.cn/news/560167.html

相关文章

Windows——Win10系统笔记本的触摸板失灵怎么办?

Win10系统用笔记本触摸板失灵怎么办&#xff1f;

笔记本触摸板双指失灵

华硕笔记本是驱动出现问题&#xff0c;找到驱动自行修复即可&#xff0c;如图

笔记本触摸板没反应怎么回事?笔记本触控板失灵解决办法

华硕飞行堡垒FX504GE-FX80GE 系统WIN10专业版64位 驱动貌似正常&#xff0c;可以尝试以下几方面检查排除故障&#xff1a; 1、去华硕官网下载最新的触控板驱动 2、进入bios检查触控板是否被禁用 3、按快捷键打开触控板 4、用驱动人生更新驱动 5、检查系统和触控板控制面板设置…

笔记本 触摸板无法使用 解决办法

拔掉全部外设&#xff0c;U盘&#xff0c;电源线 关机后 按住开机键20秒以上 之后在开机 我是这样解决的 来源 https://tieba.baidu.com/p/6663546687

java面试题 --- IO

1. IO流的分类有哪些&#xff1f; 按照流向分为输入流和输出流&#xff1b;按照实现功能分为节点流和处理流。节点就是从一个特定的地方读写数据&#xff0c;包括数组操作&#xff0c;管道操作和文件操作&#xff1b;处理流对已存在的流进行封装和处理&#xff0c;包括缓冲操作…

联想笔记本触摸板失灵的一个原因及解决方法

今天不小心点击了笔记本上面的飞行模式&#xff0c;关闭飞行模式后&#xff0c;发现触摸板没反应了&#xff0c;没有禁用、更新驱动都没用。最后将设备管理器里面**“鼠标和其他指针设备”中的“ELAN pointing device”禁用就可以了。**

电脑触摸板失灵问题

情况&#xff1a; 这边先介绍一下我遇到的问题&#xff0c;本人联想ThinkPadwin11操作系统。 由于本人特别喜欢用触摸板操作&#xff0c;今天在写bug的时候居然遇到了这样的情况&#xff1a; 原本一个手指的操作需要两个手指&#xff08;也就是移动光标&#xff09;&#xf…

电脑触摸板失灵怎么办(如何启动/禁用触摸板)

前言 前几天上专业课&#xff0c;老秋拿着电脑在写论文&#xff0c;说她电脑触摸板不管用了。 “会不会修&#xff1f;~” 我说&#xff1a;“我不会~”。 “但是可以查度娘啊~” 然后开启了一波度娘搜索。 解决 由于win7和win10系统不一样&#xff0c;所以在一些设置上也有…