https://open8gu.com/concurrent/thread-pool/gcg3etelu75edrnd/

回答话术

因为这线程池的线程复用和超时回收在一个方法里,关联性较强,所以在一篇文章回答里说明。

1. 线程复用

当线程池通过 addWorker 方法创建了运行线程 Worker 后,线程会通过 runWorker 去运行相关任务。该线程运行任务完成后并不会直接销毁,因为 runWorker 方法会让线程在一个 while 循环中,反复调用 getTask 方法从阻塞队列中获取新的任务并执行。

通过该机制保障了在满足工作线程不销毁的前提下,让工作线程不断从阻塞队列中拿到新的任务并运行,保障了线程池线程复用机制。

image.png

2. 线程超时回收

按照上面的逻辑,那线程池里的线程岂不是会一直在 while 循环中拿阻塞队列的任务并运行?如何实现线程池中设置了 keepAliveTime 的空闲回收机制呢?看管莫急,且看下文讲解。

线程池中线程从阻塞队列中获取任务的 getTask 方法有两种机制,第一种是无限期等待阻塞队列中有任务了返回,还有一种是等待设置 keepAliveTime 时间之后返回,如果说等待了 keepAliveTime 时间之后阻塞队列中还是没有任务,那么会返回空,并在 getTask 方法中返回空,最终在 runWorkerask 方法中执行线程销毁逻辑,这个过程也就是超时回收。

image.png

如果之前没有了解过线程超时回收机制,建议看看问题详解章节。

问题详解

1. 前置知识&相关代码

线程池中的执行线程被包装为了 Worker 对象,并通过内部字段 thread 运行。可以看到 Worker 对象实现了 Runnable 接口,重写 run 方法调用了 runWorker 方法。