前言
最近发现很多小伙伴对于Java
线程池ThreadPoolExecutor
的原理不是特别的理解,所以想通过这篇文章来让大家更好的认识线程池的原理,了解到其是如何工作的?
讲解
下面我会将线程池比作一个公司的一个部门,介绍线程池如何工作的,同时介绍其中的一些关键组件和参数。
ThreadFactory
一天,某家公司由于业务发展需要,准备建立一个新的部门。由于这个部门的业务公司里是没有一个人接触过,准备招聘一批人来干这个活。
但是这个招人肯定会对人才有要求吧,所以就需要HR
来把关了,通过HR
来控制入职的人员的素质。(这里把员工比作线程,HR
比作ThreadFactory
,实际上线程是由ThreadFactory
创建的)
corePoolSize
既然上面都提到招人了,那当然不可能无限招人,这个岗位是有上限(corePoolSize
是核心线程池的大小,而这里是比作核心员工的上限,毕竟核心员工不会随便解雇)。
需要注意,线程池实际工作是会在当前没有空闲的核心线程时,且当前核心线程数没有达到上限corePoolSize
时,直接创建一个新的核心线程。
maximumPoolSize
随着工作的开展,核心员工逐渐招满人了。可是偶尔也会出现工作太大,核心员工工作无法按期完成的情况。
于是老板灵机一动,干脆招一批外包吧。就让HR
来把关这批外包的素质。
而核心员工数+外包员工数=部门总人数(maximumPoolSize
是线程池的大小,这里比作部门总人数)。
这里需要注意,既然都是HR
把关的人,也就是说线程都会由ThreadFactory
创建的。
keepAliveTime和unit
既然招聘的是外包,那当然有聘期(keepAliveTime
指的是线程存活时间,这里比作外包的聘期)了,而且聘期肯定是有时间单位(unit
指的是线程存活时间的时间单位)。
workQueue
HR
好不容易招满了外包,可是部门的人却发现工作的确是做不完啊,怎么办呢?
只好是把任务排期了(workQueue
指的是阻塞队列BlockingQueue
对象,这里比作任务排期),如果谁状态好可以从排期的任务中把任务提前做了。
handler
但是部门的人排期后发现,工作实在太多了,排期都排到要天天加班才能搞定。
于是部门的人干脆向领导投诉了,拒绝这么多工作,至于怎么拒绝就得看他们怎么做了(handler
指的是拒绝执行处理器RejectedExecutionHandler
,只有当线程池每个线程都在工作中,且BlockingQueue
达到上限才会触发。)
allowCoreThreadTimeOut
某一天老板想不开,觉得这个部门的员工没必要留,可是部门的业务还有赚钱的。
于是他灵机一动,为什么不整个部门都招外包来干活呢?
于是整个部门都是外包了,工作不忙时就可以很方便的减少人员了。(allowCoreThreadTimeOut
是设置核心线程是否允许超时的标志位,默认为false
即核心线程不允许超时回收,而设置为true
时,核心线程如果在一定时间内keepAliveTime
无任务处理就会触发超时回收)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。