更多精彩,请关注xhJaver,微信官方账号。来自JD.COM的工程师将与您一起成长。首先,我们要弄清楚线程池的几种状态。1.运行此状态表明线程池处于正常状态,可以解决任务和接受任务。2.SHUTDOWN这个状态表示线程池处于正常的关闭状态,不再接受任务。但是它可以解决线程池中剩余的任务。3.STOP这个状态表示线程池处于挂起状态,不仅不会接收新的任务,还会中断正在进行的任务。4.整理此状态表示线程池中没有任务,所有任务都已停止。5.终止线程池被完全终止。它们的状态转换图如下:线程池state.png < fig caption style = " margin-top:5px;文本对齐:居中;颜色:# 888;font-size:14px;"& gt线程池状态;corePoolSize如果((wc & gtmaximumPoolSize ||(定时& amp& amptime dout))& amp;& amp(wc & gt1 | | work queue . isempty()){ if(compareandcrementworkercount(c))返回null继续;} try {//这里timed为真时,采用超时获取元素的方法,否则采用一直阻塞的方法。Runnable r =定时?workQueue.poll(keepAliveTime,TimeUnit。纳秒):work queue . take();//返回if (r!= null)返回r;timedOut = true} catch(interrupted exception retry){ time dout = false;}}}可以看出getTask是用超时标志计时的。我们在第一篇文章的线程池原理中说过,如果核心线程空闲了几分钟,就会被销毁,或者在这里,如果在keepAliveTime内没有拾取任务,也就是线程空闲,就退出runWorker中的while循环,销毁线程。 你确定核心不会被摧毁?我们注意到有一个allowCoreThreadTimeOut变量。如果为真,那么核心线程也是一个可析构的threadpooleuxecutor。AllowcorethReadTimeout(true);真的有核心线程和非核心线程吗?其实没什么区别。都是一样的线程。线程池的源代码中没有核心线程的标记,但是有多个核心线程。第一个线程在该数字之前创建,而线程在该数字之后创建。默认情况下,在这个数字之后创建的线程将在keepAliveTime的空闲时间被销毁。为了方便记忆,称之为非核心线程VII。总结一下大致流程。线程池源代码流chart.png如下图所示。在我们将任务提交给线程池后,线程池会将我们的任务封装到一个worker中,里面有要执行的线程T和要执行的任务。这个线程T的主要任务是t.start运行runworker方法。在runworker方法中,总是在循环中获取提交的任务。如果没有已提交的任务,则取决于队列中是否有任何任务。当你得到排队的任务时,你将判断超时标志是否为真。如果为真,如果在超时期限内没有得到任务,将返回null,然后销毁当前线程。否则,你会等到你得到任务,你不会破坏线程,从而实现线程重用。 更多精彩请关注微信官方账号xhJaver,JD.COM的工程师与你一起成长。