通俗易懂的Java线程池原理

前言

最近发现很多小伙伴对于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无任务处理就会触发超时回收)

你可能感兴趣的:(java,线程池)