当前位置:网站首页>【面试:并发篇38:多线程:线程池】ThreadPoolExecutor类的基本概念
【面试:并发篇38:多线程:线程池】ThreadPoolExecutor类的基本概念
2022-07-31 06:02:00 【I cream】
【面试:并发篇38:多线程:线程池】ThreadPoolExecutor类的基本概念
00.前言
如果有任何问题请指出,感谢。
01.介绍

ThreadPoolExecutor类实现了ExecutorService接口,他与ScheduledThreadPoolExecutor类的不同是ScheduledThreadPoolExecutor是带有任务调度功能的线程池实现 这个我们之后再讲。
02.ThreadPoolExecutor-池状态
ThreadPoolExecutor使用int的高3位来表示线程池状态,第29位表示线程数量
| 状态名 | 高3位 | 接收新任务 | 处理阻塞队列任务 | 说明 |
|---|---|---|---|---|
| RUNNING | 111 | Y | Y | |
| SHUTDOWN | 000 | N | Y | 不会接收新任务,但会处理阻塞队列剩余任务 |
| STOP | 001 | 会中断正在执行的任务,并抛弃阻塞队列任务 | ||
| TIDYING | 010 | 任务全执行完毕,活动线程为0即将进入终结 | ||
| TERMINAIED | 011 | 终结状态 | ||
| 为什么线程池状态与线程池数量要用一个数字表示,而不用两个数字,原因是这两个信息存储在一个原子变量ctl中,这样以后就可以只用一次cas原子操作进行赋值。 |
03.构造方法

我们可以看到ThreadPoolExecutor类的构造方法有很多参数,我们一个一个解释
corePoolSize:核心线程数目
maximumPoolSize:最大线程数目
keepAliveTime:生存时间-针对急救线程
unit:时间单位-针对救急线程
workQueue:阻塞队列
threaFactory:线程工厂-可以为线程创建时起名
hander:拒绝策略
ThreadPoolExecutor与我们自定义线程池的区别
- 救急我们自定义线程池,线程池中只有一种线程就是核心线程,且我们的核心线程有take方法与pull方法。但ThreadPoolExecutor线程池有两种线程 一种是核心线程 数量时corePoolSize,一种是救急线程 数量是maximumPoolSize-corePoolSize,且核心线程只有take方法 救急线程只有pull方法,这就是为什么keepAlivTime与unit只针对救急线程。
- 自定义线程池不能规定线程池中线程的名字,ThreadPoolExecutor线程池则可以通过threaFactory参数改变线程的名字
- 自定义线程池与ThreadPoolExecutor线程池的拒绝策略
工作方式
介绍
我们知道自定义线程池中只有核心线程,所以自定义线程池的流程是:
创建任务->交给空闲的核心线程执行->超出部分的任务放入任务队列->如果此时有空闲核心线程则从任务队列里获取任务执行->如果没有空闲线程 且任务队列也满了->生产线程执行拒绝策略
ThreadPoolExecutor线程池中有核心线程与救急线程,所以ThreadPoolExecutor线程池的流程是:
补充:ThreadPoolExecutor线程池的核心线程没有超时时间,救急线程有。
创建任务->交给空闲核心线程执行->超出部分的任务放入任务队列->如果此时有空闲核心线程->如果此时有空闲核心线程则从任务队列里获取任务执行交给核心的->如果没有空闲线程 且任务队列也满了->创建救急线程 多出的任务交给救急线程执行->如果救急线程也没有空闲了->生产线程执行拒绝策略
解释
可以看出救急线程的作用是在核心线程与任务队列都满的情况下 创建救急线程 如果救急线程在超时时间内没有获取到任务则从线程池中移除。
拒绝策略
如果核心线程没有空闲 任务队列满了 救急线程没有空闲,在这种情况下执行拒绝策略,拒绝策略jdk提供了四种实现。
- AbortPolicy 让调用者抛出 RejectedExecutionException 异常,这是默认策略
- CallerRunsPolicy 让调用者运行任务
- DiscardPolicy 放弃本次任务
- DiscardOldestPolicy 放弃队列中最早的任务,本任务取而代之
边栏推荐
- 运行 npm 会弹出询问 “你要如何打开这个文件?“
- Detailed explanation of js prototype
- js原型详解
- Postgresql source code learning (33) - transaction log ⑨ - see the overall process of log writing from the insert record
- 芯塔电子斩获第十一届中国双创大赛芜湖赛区桂冠
- 【解决】mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止
- PCB抄板
- tidyverse笔记——管道函数
- 单点登录 思维导图
- 第十六章:构建n(5,7)阶素数幻方
猜你喜欢

Zero-Shot Learning & Domain-aware Visual Bias Eliminating for Generalized Zero-Shot Learning

Core Tower Electronics won the championship in the Wuhu Division of the 11th China Innovation and Entrepreneurship Competition

mysql的下载及安装使用

LeetCode刷题——摆动序列#376#Medium

PCB抄板

DirectExchange switch simple introduction demo

运行 npm 会弹出询问 “你要如何打开这个文件?“

Automatic translation software - batch batch automatic translation software recommendation

自动翻译软件-批量批量自动翻译软件推荐

关于求反三角函数的三角函数值
随机推荐
第十六章:构建n(5,7)阶素数幻方
数据库概论 - MySQL的简单介绍
第三方库-store
codec2 BlockPool:unreadable libraries
安装gstreamer开发依赖库到项目sysroot目录
从 Google 离职,前Go 语言负责人跳槽小公司
Database Principles Homework 2 — JMU
Kubernetes scheduling
nohup principle
零样本学习&Domain-aware Visual Bias Eliminating for Generalized Zero-Shot Learning
Postgresql source code learning (33) - transaction log ⑨ - see the overall process of log writing from the insert record
Zotero | Zotero translator plugin update | Solve the problem that Baidu academic literature cannot be obtained
Web浏览器工作流程解析
(border-box) The difference between box model w3c and IE
一文读懂 MongoDB 和 MySQL 的差异
04-SDRAM:读操作(突发)
(border-box)盒子模型w3c、IE的区别
批量免费文字翻译
SQL Server Datetime2数据类型
Exam Questions Previous True Questions Wrong Bills [The Fourth Session] [Provincial Competition] [Group B]