先说结论:创建一个临时线程直接执行
ThreadPoolExecutor.excute()
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
// 如果没有在工作线程,则尝试添加一个新线程
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
如果核心线程数为 0,那么任务来了,没有核心线程处理,正常策略上来说会进入工作队列排队等待,但是会有一个问题就是,队列不满那就不会有任何的线程来处理这个任务,这是不可取的,所以线程池底层对于这种情况采取特殊的策略
只要核心线程数为 0,那么任务来了就直接创建一个临时线程来执行此任务。
当有一个(临时)工作线程之后,后续来的任务也是按照正常的策略去工作任务队列排队等待(一切照旧,相当于创建的临时线程当核心线程使)