任务执行
ThreadPoolExecutor执行任务的主要方法为:execute、submit、invoke及其重载。
execute
execute 函数定义
public void execute(Runnable command)
execute函数功能说明
提交任务到线程池执行。
execute源码
if (command == null)
throw new NullPointerException();
// 获取ctl
int c = ctl.get();
// 计算当前线程池中的worker数量是否小于corePoolSize
// 线程池线程数量小于corePoolSize就立即添加worker执行任务
if (workerCountOf(c) < corePoolSize) {
// 如果小于corePoolSize则新建线程向线程池中添加该线程
if (addWorker(command, true))
// 添加线程成功直接return
return;
c = ctl.get();
}
// 下面代码处理任务没有直接添加worker执行场景,就是线程池当前的线程数大于等于corePoolSize场景
// 如果线程池处于RUNNING状态,那么就将任务添加到等待队列中
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
// 将任务添加到队列后再次检查是否线程池是否处于运行状态
// 如果线程池不在运行状态,那么就将任务从任务队列中移除
// 并且调用Reject策略
if (! isRunning(recheck) && remove(command))
reject(command);
// 检查worker数量是否为0,如果为0则向线程池添加worker
// 如果进入到这个分支的话,那么线程池处于RUNNING状态或者线程池不处于RUNNING状态且从工作队列中移除任务失败
// 这里检查工作线程是否为0是为了防止线程池没有可以执行任务的线程
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
// 如果线程池不处于运行状态或者任务不能入队就尝试添加线程池,那么这里会尝试增加工作线程数量
// 如果线程没有新建成功,那么此时线程池可能已经停止或者饱和(已经达到最大线程数且队列已经达到最大数量)
// 那么就调用Reject策略
else if (!addWorker(command, false))
reject(command);