当前位置:网站首页>【面试:并发篇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 放弃队列中最早的任务,本任务取而代之
边栏推荐
猜你喜欢
解决安装 Bun 之后出现 zsh compinit: insecure directories, run compaudit for list. Ignore insecure directorie
PCB抄板
运行 npm 会弹出询问 “你要如何打开这个文件?“
Analysis of the implementation principle and detailed knowledge of v-model syntactic sugar and how to make the components you develop support v-model
Database Principles Homework 2 — JMU
从 Google 离职,前Go 语言负责人跳槽小公司
从入门到一位合格的爬虫师,这几点很重要
浅层了解欧拉函数
【Go语言入门教程】Go语言简介
【Go报错】go go.mod file not found in current directory or any parent directory 错误解决
随机推荐
【解决】npm ERR A complete log of this run can be found in npm ERR
【TA-霜狼_may-《百人计划》】美术2.3 硬表面基础
文件 - 05 下载文件:根据文件Id下载文件
【Go】Go 语言切片(Slice)
【云原生】-Docker安装部署分布式数据库 OceanBase
One of the small practical projects - food alliance ordering system
Database Principles Homework 2 — JMU
tidyverse笔记——tidyr包
R——避免使用 col=0
线程中断方法
360 push-360 push tool-360 batch push tool
gstreamer's caps event and new_segment event
简单谈谈Feign
DirectExchange交换机简单入门demo
【微服务】 微服务学习笔记二:Eureka注册中心的介绍及搭建
事务的传播机制
codec2 BlockPool:unreadable libraries
浅析重复线性渐变repeating-linear-gradient如何使用
Kubernetes调度
浅层了解欧拉函数