探秘提交任务到线程池后源码的执行流程
-
- 1、背景
- 2、任务提交
- 2、Worker线程获取任务执行流程
- 3、Worker线程的退出时机
1、背景
2、任务提交
线程池任务提交有两种方式,execute()和submit()。首先看一下execute方法的源码。我们发现它接收的入参是一个Runnable类型。我们按照代码截图中的序号依次分析,具体分析内容如图2所示。
[1]首先,一进方法就先对command进行校验,如果command为空就直接抛出NPE异常;
[2,3]然后判断一下线程池中的线程个数是否小于corePoolSize,如果满足条件就调用addWorker(command, true)方法区执行任务。这个方法实际上最终就是开启了新的线程去执行任务。
[4]如果说线程池处于RUNNING状态,也就是isRunning©返回true,那么就将任务添加到阻塞队列。也就是执行workQueue.offer(command)。
[5,6]为了确保能够准确的将任务添加成功,线程池在这里做了二次校验。这里是因为,如果将任务添加到线程池之后,有可能线程池状态已经变化了,所以要校验一下,看看当前的线程池状态还是不是RUNNING。
如果线程池状态不是RUNNING了,就把任务从任务队列中删除,也就是remove(command),然后就执行拒绝策略,也就是调用reject(command)方法。
[7]