前言
研究线程池
时,存在7大参数
。每个参数都有其特定的含义,上一篇博客(JUC之线程池)中针对线程池
的创建
、使用
、拒绝策略
等做了详细的说明。
思来想去,针对自定义线程池
操作中的7大参数
极易混淆,本篇博客采取图谱
的形式进行参数解释。
7大参数
参考java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor()
构造方法结果而言。
源码如下:
public ThreadPoolExecutor(int corePoolSize,//核心线程数
int maximumPoolSize,//最大线程数
long keepAliveTime,//存活时间(限定时间内无调用则释放)
TimeUnit unit,// 存活的时间单位
BlockingQueue<Runnable> workQueue,//阻塞队列
ThreadFactory threadFactory,//线程工厂,创建线程
RejectedExecutionHandler handler //拒绝策略
)
各项参数理解
假设某人,这里起名小A
去银行办理业务,此时银行中的柜台如下所示:
小A
来到前台1
,进行业务办理。
此时小B
也来到银行,前往前台2
,进行业务办理。
前台1
和前台2
此时则为核心处理数 corePoolSize
;
前台 3
、前台4
和前台5
则为最大处理数 maximumPoolSize
。
此时小A
和小B
在办理业务的同时,此时又来了几个需要办理业务的,此时刚来的几个则会前往等待厅
进行等待。
此时的
等候厅
就是队列,其中能坐多少人,则表示队列容量
。
[注意:]
可能有人会问,什么时候会开启前台3~5
?
在
前台1~2
占用,且队列满
时,会开启前台3~5
。
假设这天办理业务的人数特别多,银行当前有效的前台并不能及时的处理业务需求,此时银行则会开放剩下的3个窗口。
此时还有人陆续在来银行,发现此时银行人数过多,此时保安就需要管理人数。
此时的保安,则表示
拒绝策略
。
假设此时快到吃饭点了,银行需要办理业务的人少了很多,此时前台1
和前台2
也刚好可以处理的过来。
但是此时为了防止突然会有大量人办理业务,不能立刻关闭前台3~前台5
。
需要等待一段时间,持续无人时,再来关闭。
等待时间
就可以理解为存活时间 keepAliveTime
,以及等待是小时还是分钟,则为unit
。