当前位置:网站首页>多线程之ThreadPoolExecutor
多线程之ThreadPoolExecutor
2022-08-11 02:18:00 【七国的天下,我要九十九】
关系类图为:
1 线程池状态
ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量
状态名 | 高3位 | 接收新任务 | 处理阻塞队列任务 | 说明 |
---|---|---|---|---|
RUNNING | 111 | Y | Y | |
SHUTDOWN | 000 | N | Y | 不会接收新任务,但会处理阻塞队列剩余 任务 |
STOP | 001 | N | N | 会中断正在执行的任务,并抛弃阻塞队列 任务 |
TIDYING | 010 | 任务全执行完毕,活动线程为 0 即将进入 终结 | ||
TERMINATED | 011 | 终结状态 |
从数字上比较,TERMINATED > TIDYING > STOP > SHUTDOWN > RUNNING
信息存储在一个原子变量 ctl 中,目的是将线程池状态与线程个数合二为一,这样就可以用一次 cas 原子操作 进行赋值
// c 为旧值, ctlOf 返回结果为新值
ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))));
// rs 为高 3 位代表线程池状态, wc 为低 29 位代表线程个数,ctl 是合并它们
private static int ctlOf(int rs, int wc) {
return rs | wc; }
2 构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
/* 参数说明: corePoolSize 核心线程数目 maximumPoolSize 最大线程数目 keepAliveTime 生存时间 unit 时间单位 workQueue 阻塞队列 threadFactory 线程工厂 - 可以为线程创建时起个好名字 handler 拒绝策略 */
工作方式:
线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务
当线程数达到 corePoolSize 并没有线程空闲,这时再加入任务,新加的任务会被加入workQueue 队列排 队,直到有空闲的线程
如果队列选择了有界队列,那么任务超过了队列大小时,会创建 maximumPoolSize - corePoolSize 数目的线 程来救急
如果线程到达 maximumPoolSize 仍然有新任务这时会执行拒绝策略。拒绝策略 jdk 提供了 4 种实现,其它 框架也提供了不同的实现
- jdk
- AbortPolicy 让调用者抛出 RejectedExecutionException 异常,默认策略
- CallerRunsPolicy 让调用者运行任务
- DiscardPolicy 放弃本次任务
- DiscardOldestPolicy 放弃队列中最早的任务,本任务取而代之
- Dubbo 的实现,在抛出 RejectedExecutionException 异常之前会记录日志,并 dump 线程栈信息,方 便定位问题
- Netty 的实现,是创建一个新线程来执行任务
- ActiveMQ 的实现,带超时等待(60s)尝试放入队列
- PinPoint 的实现,它使用了一个拒绝策略链,会逐一尝试策略链中每种拒绝策略 (类似责任链那种)
- jdk
当高峰过去后,超过corePoolSize 的救急线程如果一段时间没有任务做,需要结束节省资源,这个时间由 keepAliveTime 和 unit 来控制。
拒绝策略类图
边栏推荐
- 架构篇(二)架构的复杂度来源
- 联盛德W801系列6-从微信小程序的角度来分析W801的蓝牙通信源码(indicate方式)
- SyntaxError: invalid syntax
- [oops-framework] Template project [oops-game-kit] Introduction
- 软件测试面试题:谈谈你对 cmm 和 is9000 的认识?
- 网络安全笔记第四天day4(kali基本操作)
- 一言(ヒトコト)Hitokoto API
- Mysql_Note5
- Future Trends in Vulnerability Management Programs
- 软件测试面试题:什么是数据的对立性,有几个层次?
猜你喜欢
项目构建工具-Gradle入门
最新国产电源厂家及具体型号pin-to-pin替代手册发布
微信公众号后台管理
【C 数据存储详解】(1)——深度剖析整形数据在内存中的存储
qtcreator调试webkit
Engineering Design of Single-sided PCB Routing Impedance
Deep Learning [Chapter 2]
MySQL Basics [Part 1] | Database Overview and Data Preparation, Common Commands, Viewing Table Structure Steps
OpenHarmony啃论文俱乐部-啃论文心得
ARM development (4) How to read the chip manual for novice Xiaobai, bare metal driver development steps and pure assembly to achieve lighting, assembly combined with c lighting, c to achieve lighting
随机推荐
Tomca启动闪退问题如何解决
Vulnhub靶机:GEMINI INC_ 2
The latest domestic power supply manufacturers and pin-to-pin replacement manuals for specific models are released
Oops novice template Framework project guide
OptiFDTD应用:用于光纤入波导耦合的硅纳米锥仿真
《QA离业务代码能有多近?》轻量级单元测试方案
MySQL Basics [Part 1] | Database Overview and Data Preparation, Common Commands, Viewing Table Structure Steps
117. 本地开发好的 SAP UI5 应用部署到 ABAP 服务器时,中文字符变成乱码的原因分析和解决方案
gRPC基础概念:闭包
js原型和原型链及原型继承
深度学习中的模型设计
Deep Learning [Chapter 2]
Shengxin experiment record (part2)--tf.reduce_sum() usage introduction
Detailed explanation of common methods of filtering matrix (array) elements in Matlab
超声图像三维拼接-可视化选择,总体思路
单面PCB布线阻抗的工程设计
[机缘参悟-66]:怎样才能让别人愿意帮你:利益共享法则、“大道”、“人性”
OpenWrt之opkg详解
MySQL - an SQL in MySQL is how to be performed?
思念家乡的月亮