线程池七大核心参数
谁代表线程池
JDK 5.0起提供了代表线程池的接口:ExecutorService
ThreadPoolExecutor构造器的参数说明
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
线程池七大核心参数转换思想
- 对于线程池的七大核心参数的理解,把官方的文字描述,抽象到现实生活中的一些事务,进行初步认识,这样转换思想,初学者可以快速了解线程池参数的含义,并加深对线程池七大核心参数的理解。
- 本文,将线程池与饮品店进行结合理解;将线程池中的线程处理任务流程,转换为员工服务顾客流程,使初识线程池的茫然感减弱,并将其与生活进行绑定。线程池七大核心参数,浅显易懂,生动有趣。
- 线程池相当于饮品店,任务相当于顾客,线程相当于员工,具体抽象如下表:
参数 | 参数说明 | 相当于 | 要求 |
---|---|---|---|
corePoolSize | 指定线程池的线程数量(核心线程) | 长期员工 | 不能小于0 |
maximumPoolSize | 指定线程池可支持的最大线程数 | 员工极限 | 最大数量 >= 核心线程数量 |
keepAliveTime | 指定临时线程的最大存活时间 | 临时员工存在时间 | 不能小于0 |
unit | 指定存活时间的单位(秒、分、时、天) | 时间单位 | 时间单位 |
workQueue | 指定任务队列 | 休闲卡座 | 不能为null |
threadFactory | 指定用哪个线程工厂创建线程 | 招聘员工 | 不能为null |
handler | 指定线程忙,任务满的时候,新任务来了怎么办 | 已招聘员工极限、而卡座已满,对顾客的处理方式 | 不能为null |
线程池主要处理流程图
流程分析
- 代码模板如下,并进行流程分析
ExecutorService executorService = new ThreadPoolExecutor(3,5,6,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(5),
Executors.defaultThreadFactory() ,
new ThreadPoolExecutor.AbortPolicy());
- 线程池中线程数小于corePoolSize时,新任务将创建一个新线程执行任务,不论此时线程池中存在空闲线程;
相当于:饮品店中正在工作的员工数量少于长期员工数量时,新的顾客将由一名长期员工服务,无论此时店中是否有临时员工(正常经营)
- 线程池中线程数达到corePoolSize时,新任务将被放入workQueue中,等待线程池中任务调度执行;
相当于:饮品店中正在工作的员工数量达到长期员工数量时,新的顾客将位于卡座队列中,进行等待店中任意一名员工过来服务(排队等待)
- 当workQueue已满,且maximumPoolSize>corePoolSize时,新任务会创建新线程执行任务;
相当于:当店中的卡座队列已满,且本店最多可招聘员工数量大于当前长期员工数量,新的顾客来临时,饮品店将招聘一名临时员工进行为其服务。(招聘员工)
- 当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理;
相当于:当店中的卡座队列已满,且客户的数量超过本店可最多招聘员工的数量时,新的顾客的解决由RejectedExecutionHandler处理。(例如:拒绝服务)
- 当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收该线程;
相当于:当店中的员工数量超过长期员工的数量时,且这些员工的空闲时间超过临时员工的存在时间,则进行解雇临时员工。(解雇临时员工)
- 常见考题
- 临时线程什么时候创建啊?
新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。 - 什么时候会开始拒绝任务?
核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝