当前位置:网站首页>【面试:并发篇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 放弃队列中最早的任务,本任务取而代之
边栏推荐
- 数据库概论 - MySQL的简单介绍
- postgresql源码学习(33)—— 事务日志⑨ - 从insert记录看日志写入整体流程
- mysql索引失效的常见9种原因详解
- 英语翻译软件-批量自动免费翻译软件支持三方接口翻译
- 新瓶陈酒 --- 矩阵快速幂
- Postgresql source code learning (33) - transaction log ⑨ - see the overall process of log writing from the insert record
- 【云原生】-Docker安装部署分布式数据库 OceanBase
- Install the gstreamer development dependency library to the project sysroot directory
- Difficulty comparison between high concurrency and multithreading (easy to confuse)
- 第十七章:回溯探求指定入口的马步遍历,贪心无回溯探求马步遍历,递归探求nxm棋盘带障碍马步遍历
猜你喜欢
【Go语言入门教程】Go语言简介
搭建zabbix监控及邮件报警(超详细教学)
LeetCode brush # 376 # Medium - swing sequence
Postgresql source code learning (34) - transaction log ⑩ - full page write mechanism
【云原生】-Docker容器迁移Oracle到MySQL
【C语言项目合集】这十个入门必备练手项目,让C语言对你来说不再难学!
【编程题】【Scratch三级】2022.03 冬天下雪了
Bulk free text translation
树状数组(单点修改区间查询和区间修改单点查询)
毫米波技术基础
随机推荐
【并发编程】ReentrantLock的lock()方法源码分析
浅析v-model语法糖的实现原理与细节知识及如何让你开发的组件支持v-model
【科普向】5G核心网架构和关键技术
文件 - 04 下载文件: 根据文件下载链接下载文件
nohup原理
安装gstreamer开发依赖库到项目sysroot目录
第三方库-store
什么是浮动?什么是文档流?清除浮动的几种方式及原理?什么是BFC,如何触发BFC,BFC的作用
事务的四大特性
Gradle remove dependency demo
postgresql源码学习(34)—— 事务日志⑩ - 全页写机制
数据库原理作业3 — JMU
文件 - 07 删除文件: 根据fileIds批量删除文件及文件信息
DDL+DML+DQL
MySQL的触发器
【Go语言刷题篇】Go完结篇函数、结构体、接口、错误入门学习
线程唤醒机制
【 TA - frost Wolf _may - "one hundred plan" 】 art 2.3 hard surface
数据库原理作业2 — JMU
Moment.js common methods