java线程池源码解析:ThreadPoolExecutor源码,execute方法、addWorker方法解析

1.  概述

线程池 的作用不用太说了,线程池会按照一定的规则,创建和维护一定数量的线程。这些线程可以被循环利用,来处理用户提交的任务。对比不同线程池的使用方式,节省了频繁的创建和销毁线程带来的性能开销。

2.  概念理解

2.1 工作线程(worker)

指的是当先线程池用于处理任务的worker对象,每个worker对象内部持有一个thread对象。

2.2 任务

调用方,要执行的业务鹿皮,一半应该是callable或者Runnable的实现。

2.3 任务队列

线程池哪位维护了一个队列,用来存储待处理的任务,每个线程都可以从该队列获取任务进行处理。

2.4 核心线程数

线程池哪部需要维持的一个最小的数量的工作线程,工作线程数量不足这个数量的时候,新来的任务都会提交一个新的工作线程,任务不会放入 队列。工作线程数到达这个数量的时候,新来的的任务,都会放入这个队列中。所有的工作线程,都回去轮训这个任务队列。

2.5 线程池一共有5种工作状态。

running:正常运行的状态,此时,可以正常接受和处理任务。

shuntdown: 此时不可以接收新的任务,但是可以正常处理,但是不再接受新的任务,并且终端空闲的工作状态

stop:  此时清除队列中的没有处理的任务,中断所有的工作线程。

tidying: 从shuntdown  或者 stop 自动流转到这个状态。任务列表和工作线程,都为空。

terminated: 终止状态,从tidiying状态自动流转到此状态。此时队列中的任务为空,工作线程列表为空,并且已经执行完 terminated 回调函数。


// Integer.SIZE = 32 ,所以这个 COUNT_BITS = 29,意思是存储工作线程数的二进制为占29位
private static final int COUNT_BITS = Integer.SIZE - 3;/*CAPACITY 实际上就是2的29次方减1,具体的实际数值是多少不重要,重点是关注二进制表示:1左移29位实际上就是:0010 0000 0000 0000 0000 0000 0000 0000再减个1后得到的就是:0001 1111 1111 1111 1111 1111 1111 1111所以这个CAPACITY的有效位就是29个1
*/ 
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;/* --- 状态值的定义 开始 ---*/// runState is stored in the high-order bits
// 状态值存储在高(3)位
/*
-1的二进制表示:1111 1111 1111 1111 1111 1111 1111 1111 (补码标识法)
-1左移29位之后:111 00000 0000 0000 0000 0000 0000 0000 (左侧切断,右侧补0)
*/
private static final int RUNNING    = -1 << COUNT_BITS;/*
0的二进制表示:0000 0000 0000 0000 0000 0000 0000 0000
0左移29位之后:000 00000 0000 0000 0000 0000 0000 0000 (还是0)
*/
private static final int SHUTDOWN   =  0 << COUNT_BITS;/*
1的二进制表示:0000 0000 0000 0000 0000 0000 0000 0001
0左移29位之后:001 00000 0000 0000 0000 0000 0000 0000 
*/
private static final int STOP       =  1 << COUNT_BITS;/*
2的二进制表示:0000 0000 0000 0000 0000 0000 0000 0010
0左移29位之后:010 00000 0000 0000 0000 0000 0000 0000 
*/
private static final int TIDYING    =  2 << COUNT_BITS;/*
3的二进制表示:0000 0000 0000 0000 0000 0000 0000 0011
0左移29位之后:011 00000 0000 0000 0000 0000 0000 0000 
*/
private static final int TERMINATED =  3 << COUNT_BITS;/*针对以上5个变量的总结,右侧的29位都是0,RUNNING的二进制以1打头,转换为整型为负值,所以这几个状态的整型数值从上到下依次增大。
*//* --- 状态值的定义 结束 ---*//*将状态和线程数整合到一个数值的方法(利用二级制的或运算)rs:一定是上面5个状态中的一个wc:线程数是个不固定的正数值因为rs的右侧29为都是0,而wc在逻辑上限制了其最大值不能超过CAPACITY,所以wc的前3位一定是0,所以整合之后的数值实际上是:rs的前三位 + wc的后29位
*/
private static int ctlOf(int rs, int wc) { return rs | wc; }/*从整合后数值c中拆分出来状态值状态值 = c的前3位 + 29个0c 和 CAPACITY取反 做与运算CAPACITY:0001 1111 1111 1111 1111 1111 1111 1111取反之后:1110 0000 0000 0000 0000 0000 0000 0000因为前3位都是1,所以无论c的前3位是什么,与运算后都会保留c的前3位不变因为后29位都是0,所以无论c的后面是什么,与运算后都会变为29个0这样就还原出状态值。
*/
// Packing and unpacking ctl
private static int runStateOf(int c)     { return c & ~CAPACITY; }
/*从整合后数值c中拆分出来工作线程数工作线程数 = 3个0 + c的后29位c 和 CAPACITY 做与运算CAPACITY:0001 1111 1111 1111 1111 1111 1111 1111因为前3位都是0,所以无论c的前3位是什么,与运算后都会变为0因为后29位都是1,所以无论c的后面是什么,与运算后都保持c的后29位不变这样就还原出了工作线程数的值。
*/
private static int workerCountOf(int c)  { return c & CAPACITY; }// 把整合后的值包装到一个原子变量中,下文称控制标识
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从FasterTransformer源码解读开始了解大模型(2.0)代码通读01

从FasterTransformer源码解读开始了解大模型&#xff08;2.0&#xff09;代码解读01-看看头文件 写在前面的话 本篇的内容直接开始我们的代码通读&#xff0c;整个通读可能需要好几篇文章来将一整个gpt的代码结构给讲清楚。目前的计划是先从整体model层次开始讲&#xff0c;将…

Java8 Stream API在集合上执行复杂的数据处理查询

Java 8 引入的 Stream API 是一个高级工具&#xff0c;用于在集合上执行复杂的数据处理查询。Stream API 通过提供一系列的中间操作和最终操作&#xff0c;支持声明式处理&#xff08;类似于SQL声明式语句&#xff09;并且可以轻松使用多核架构。 创建Stream流 创建Stream 流…

HTML+VUE3组合式+ELEMENT的容器模板示例(含侧栏导航,表格,...)

一个简单的在html中使用Vue3及Element-plus vue-icons的整合示例&#xff1a; 一、示例截图 二、文件代码 直接复制到html文件在浏览器打开即可预览 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&g…

CCleaner系统优化与隐私保护工具,中文绿色便携版 v6.23.11010

01 软件介绍 CCleaner 是一款高级的系统优化工具&#xff0c;其设计宗旨在于彻底清理 Windows 操作系统中积累的无用文件和冗余的注册表项。此举旨在显著提升计算机的运行效率并回收磁盘空间。该软件拥有高效的能力&#xff0c;可以清除包括临时文件、浏览器缓存及其历史记录在…

哪些设计模式,你使用过哪些设计模式

Java框架中运用了多种设计模式&#xff0c;以下是一些具体的例子以及它们在框架中的应用&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。例如&#xff0c;Java中的Runtime类使用了单例模式…

08 - hive的集合函数、高级聚合函数、炸裂函数以及窗口函数

目录 1、集合函数 1.1、size&#xff1a;集合中元素的个数 1.2、map&#xff1a;创建map集合 1.3、map_keys&#xff1a; 返回map中的key 1.4、map_values: 返回map中的value 1.5、array 声明array集合 1.6、array_contains: 判断array中是否包含某个元素 1.7、sort_a…

python中多态的概念及简单样例

目录 1、多态概念及关键要素&#xff1a; 2、代码样例&#xff1a; 1、多态概念及关键要素&#xff1a; 多态是面向对象编程中一个重要的概念&#xff0c;它允许不同类的对象对同一消息做出不同的响应。简单来说&#xff0c;多态性是指相同的方法调用可以在不同的对象上产生不…

UIKit之UIButton

功能需求&#xff1a; 点击按钮切换按钮的文字和背景图片&#xff0c;同时点击上下左右可以移动图片位置&#xff0c;点击加或减可以放大或缩小图片。 分析&#xff1a; 实现一个UIView的子类即可&#xff0c;该子类包含多个按钮。 实现步骤&#xff1a; 使用OC语言&#xf…

TypeScript常见面试题第七节

题目三十一:TypeScript 中声明合并的工作原理? 一、讲解视频 TS面试题三十一:TypeScript 中声明合并的工作原理? 二、题目解析 本题目考察对于 ts 中声明合并知识的了解,“声明合并”是指编译器将针对同一个名字的两个独立声明合并为单一声明。 合并后的声明同时拥有原先…

每日资讯——OpenAI与谷歌相争,火药味甚浓

OpenAI与苹果达成合作&#xff0c;ChatGPT或集成至IOS18 AI语音助手存在”幻觉“问题&#xff0c;或将集成至ChatGPT免费版 整合音频转录、文本转语音等功能的软件。奥特曼的终极目标是开发类似电影《她》中&#xff0c;可高度响应的虚拟助手&#xff0c;提升苹果Siri等现有语…

HCIP的学习(14)

过滤策略—filter-policy ​ 思科中&#xff1a;分发列表 ​ 过滤策略是只能够针对于路由信息进行筛选&#xff08;过滤&#xff09;的工具&#xff0c;而无法针对于LSA进行过滤。 在R4的出方向上配置过滤策略&#xff0c;使得R1不能学习到23.0.0.0/24路由信息1、抓取流量 […

Sping源码(七)—ConfigurationClassPostProcessor ——@PropertySources解析

序言 先来简单回顾一下ConfigurationClassPostProcessor大致的一个处理流程&#xff0c;再来详细的讲解PropertySources注解的处理逻辑。 详细的步骤可参考ConfigurationClassPostProcessor这篇帖子。 流程图 从获取所有BeanDefinition -> 过滤、赋值、遍历 -> 解析 -&…

自建WSUS更新服务器完成内网的安全补丁更新

一、适用场景 1、企业内部网络无法访问外网&#xff0c;所以搭建WSUS服务器&#xff0c;可以让内网环境进行更新补丁。 2、校园内部的电脑实训室一般不用外网资源&#xff0c;偶尔开启外网使用时&#xff0c;电脑实训室集体自动更新占用外网资源量大&#xff0c;所以搭建WSUS服…

项目文档分享

Hello , 我是小恒。提前祝福妈妈母亲节快乐 。 本文写一篇初成的项目文档 &#xff08;不是README.md哈&#xff09;&#xff0c;仅供参考 项目名称 脚本存储网页 项目简介 本项目旨在创建一个网页&#xff0c;用于存储和展示各种命令&#xff0c;用户可以通过粘贴复制命令到…

【深耕 Python】Quantum Computing 量子计算机(6)计算<m|V|n>数值积分

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 【深耕 Python】Quantum Computing 量子计算机&#xff08;2&#xff09;绘制电子运动平面波 【深耕 Python】Quantum Computing 量子计算机&…

【前端】HTML实现个人简历信息展示页面

文章目录 前言一、 综合案例&#xff1a;个人简历信息展示页面 前言 这篇博客仅仅是对HTML的基本结构进行了一些说明&#xff0c;关于HTML的更多讲解以及CSS、Javascript部分的讲解可以关注一下下面的专栏&#xff0c;会持续更新的。 链接&#xff1a; Web前端学习专栏 下面我…

039——解决室内不能使用GPS问题

目录 引入 GUI整改 client添加GPS分析 完善服务器网络通讯部分代码 添加GPS的BSW层 GPS操作部分代码&#xff08;相当于驱动&#xff09; 效果展示 项目管理操作 引入 最近在写论文加上出去玩了一圈所以停更了一段时间。上次咱们GPS有个室内用不了的问题&#xff0c;咱…

【Python从入门到进阶】54、使用Python轻松操作SQLite数据库

一、引言 1、什么是SQLite SQLite的起源可以追溯到2000年&#xff0c;由D. Richard Hipp&#xff08;理查德希普&#xff09;所创建。作为一个独立的开发者&#xff0c;Hipp在寻找一个能够在嵌入式系统中使用的轻量级数据库时&#xff0c;发现现有的解决方案要么过于庞大&…

SpringCloud使用Nacos作为配置中心实现动态数据源切换

一、Nacos-Server 了解Nacos可以直接阅读官方文档 使用Nacos&#xff0c;我们需要有Nacos-Server&#xff0c;此处就不使用官方提供的release版本了&#xff0c;而是自己编译&#xff0c;因为本来就是Java开发的&#xff0c;所以对于Javaer来说也没啥难度&#xff01; git c…

linux安装clamav病毒扫描与删除

ClamAV介绍 ClamAV是Linux操作系统一款免费的杀毒工具&#xff0c;通过命令执行病毒库升级、查找病毒和删除病毒。 安装ClamAV 方法一&#x1f4a1; Tips&#xff1a;在CentOS操作系统上安装ClamAV&#xff0c;请分别执行以下命令 yum install epel-release -y yum install cla…