方法介绍
execute方法是将任务提交到线程池中的核心方法。线程池的执行流程可以通过execute内部进行的逻辑判断得知。
代码展示与分析
- Runnable command。方法体中的参数代表着提交过来的任务。
- 任务不能为null的非空判断。不然就会抛出空指针异常。
- int c = ctl.get();获取ctl的核心属性,就是获取线程的数量。用于后续的逻辑判断。
- if (workerCountOf© < corePoolSize) 。懒加载的体现。workerCountOf拿到低29位的值,工作线程数量小于核心工作线程的条件下:if (addWorker(command, true))执行里面的方法,方法中的true代表着是添加核心工作线程。添加核心线程成功返回true,直接交给添加进去的线程处理任务就可以,直接return返回。要是失败了就false。逻辑进不来。执行下面的c = ctl.get();执行下面的方法说明线程池状态或者数量发生了变化,那就重新执行一次ctl。
- 要是上述添加核心工作线程失败之后执行后面的逻辑判断和代码。
- if (isRunning© && workQueue.offer(command))。首先线程池必须是Running状态。然后基于阻塞队列的offer方法将任务添加到阻塞队列之中。
- int recheck = ctl.get();重新获取ctl的值。
- if (! isRunning(recheck) && remove(command))。要是线程池的状态不是Running并且remove成功。那就执行拒绝策略。
- 否则要是else if (workerCountOf(recheck) == 0)。判断要是核心工作线程数是0.那就添加一个没有任务的非核心工作线程进去。防止阻塞队列中的任务饥饿问题。这里就是有两种情况:1.构建线程池的时候,核心工作线程数是0。2.存在核心工作线程,但是核心工作线程允许超时,设置allowCoreThreadTimeOut为true。
- else if (!addWorker(command, false))。执行到这里是上述添加到阻塞队列失败了。构建一个非核心工作线程,要是构建一个非核心工作线程成功那就结束。要是构建非核心工作线程也是失败的,那就执行拒绝策略。