1、先判断新线程是不是为空,为空就报空指针错误否则就往下运行;
2、判断是否小于核心线程数,小于则直接新增线程否则就往下运行;
3、尝试新增到工作队列中,添加成功就等待调用否则就往下运行;
4、再次尝试新增线程,如果当前线程池的线程数大于线程池容量或最大线程数就触发拒绝策略。
public void execute(Runnable command) { //新任务为空则报空指针 if (command == null) throw new NullPointerException(); int c = ctl.get(); //worker指一个线程,这里是判断当前线程数是否小于核心线程数 if (workerCountOf(c) < corePoolSize) { //当前线程数小于核心线程数就直接addWorker,即新增线程 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); }
addWorker方法中新增线程时的判断:
//此处判断线程数如果大于等于容量或者大于等于最大线程数都返回false if (wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize)) return false;
标签:false,队列,新增,池里,源码,command,线程,addWorker From: https://www.cnblogs.com/Bernard94/p/17987358