线程池运行原理与各个线程创建时机

最近面试遇到线程池相关问题,感觉自己线程池理解不够深入,因此总结一下线程池的运行原理和核心线程、普通线程创建时机。

提交任务

图片说明

创建时机

  1. 普通线程只有任务等待队列满载后才会创建
  2. 核心线程在任务提交时就尝试创建
  3. 先判断核心线程是否已满,然后尝试入队,入队失败再尝试创建普通线程,超过最大线程则执行任务拒绝策略。

具体流程代码

        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);