ThreadPoolExecutor 线程池执行者

ThreadPoolExecutor 线程池执行者

整体的运行逻辑,不妨举个例子。某个工厂要招工人完成订单。有两个重要的参数:1,长工的数目(假设为10),2,总工人的最大数目(假设为20)。

一开始,没有工人,所以要招长工。现在开始,每有一个订单,就去招一个工人当长工。直到长工数为10。接下来,老板考虑订单虽然多了,可是再招工人成本就太贵了,于是把新来的订单放在流水线上暂存起来,叫目前的工人做完手上的活之后赶紧去流水线上继续完成别的订单。接下来订单继续增长,老板发现现在的情况是长工已经完不成积压的订单。这怎么办呢?没办法还是要工人,要不然违约的代价更大。继续开始招短工。这些短工一般是带着任务进厂,也就是客户一来订单就立马招个短工完成这个订单从而保证任务不积压。接下来客户的订单突然少了,以至于没有订单了。老板发现很多工人无事可做,在他观察一段时间后,开始裁员,当然是先裁短工了,因为一开始的打算就是招你们进去渡过这个火爆期的,现在任务完成了,你们就该走了。于是工厂的工人数又回到了长工数。一般情况下的老板不会把长工一起裁掉,即使他们不干活,也就让他们睡觉。可是还是有很黑心的老板直接把长工都裁掉了。

以上的故事中,工厂就是线程池,工人就是worker线程,订单就是调用execute()传进来的runnable参数,长工数就是corePoolSize,总工数是maximumPoolSize,流水线就是阻塞队列,老板观察工人不干活的时间是keepAliveTime,至于老板裁不裁长工是由allowCoreThreadTimeOut参数控制的。

这就是整个线程池的运行逻辑。而工人的运行逻辑是:手上有任务就先完成手上的任务(工人的构造函数传进来的runnable),如果没有或者已经完成了就去阻塞队列找任务做,当然如果没有任务就阻塞自己。