https://open8gu.com/concurrent/thread-pool/gcg3etelu75edrnd/
因为这线程池的线程复用和超时回收在一个方法里,关联性较强,所以在一篇文章回答里说明。
当线程池通过 addWorker
方法创建了运行线程 Worker
后,线程会通过 runWorker
去运行相关任务。该线程运行任务完成后并不会直接销毁,因为 runWorker
方法会让线程在一个 while 循环中,反复调用 getTask 方法从阻塞队列中获取新的任务并执行。
通过该机制保障了在满足工作线程不销毁的前提下,让工作线程不断从阻塞队列中拿到新的任务并运行,保障了线程池线程复用机制。
按照上面的逻辑,那线程池里的线程岂不是会一直在 while 循环中拿阻塞队列的任务并运行?如何实现线程池中设置了 keepAliveTime 的空闲回收机制呢?看管莫急,且看下文讲解。
线程池中线程从阻塞队列中获取任务的 getTask
方法有两种机制,第一种是无限期等待阻塞队列中有任务了返回,还有一种是等待设置 keepAliveTime
时间之后返回,如果说等待了 keepAliveTime
时间之后阻塞队列中还是没有任务,那么会返回空,并在 getTask
方法中返回空,最终在 runWorkerask
方法中执行线程销毁逻辑,这个过程也就是超时回收。
如果之前没有了解过线程超时回收机制,建议看看问题详解章节。
线程池中的执行线程被包装为了 Worker
对象,并通过内部字段 thread 运行。可以看到 Worker
对象实现了 Runnable
接口,重写 run
方法调用了 runWorker
方法。