1 // 线程池execute方法执行流程 2 public void execute(Runnable command) { 3 // 非空判断,判断提交的任务是否为空 4 if (command == null) 5 throw new NullPointerException(); 6 // 获取ctl属性 7 int c = ctl.get(); 8 // 工作线程个数是否小于核心线程数 9 if (workerCountOf(c) < corePoolSize) { 10 // 添加一个核心线程 11 if (addWorker(command, true)) 12 // 添加核心线程成功,返回true,直接return结束 13 return; 14 // 如果在并发情况下,添加核心线程失败的线程,需要重新获取一次ctl属性 15 c = ctl.get(); 16 } 17 // 创建核心线程失败 18 // 判断当前线程池状态是否为running 19 // 如果是RUNNING,执行offer方法将任务添加到工作队列 20 if (isRunning(c) && workQueue.offer(command)) { 21 // 添加任务到工作队列成功 22 // 再次获取ctl 23 int recheck = ctl.get(); 24 // 线程池是否为RUNNING状态,如果不是RUNNING状态,需要将任务从工作队列移除 25 if (! isRunning(recheck) && remove(command)) 26 // 线程池状态不正确,执行拒绝策略 27 reject(command); 28 // 是RUNNING状态,判断工作线程是否为0 29 else if (workerCountOf(recheck) == 0) 30 // 工作线程数为0,但是工作队列中有任务在排队 31 // 添加一个空任务非核心线程,为了处理在工作队列中排队的任务 32 // 线程为SHUTDOWN的时候,需要工作线程数为0并且工作队列为空才能转换成过渡状态,最后才能销毁线程 33 // 我们创建一个任务为空的非核心线程去执行工作队列中还没处理的任务,才能保证线程状态切换不出现问题。 34 addWorker(null, false); 35 } 36 // 任务添加到工作队列失败,尝试创建非核心线程去执行当前任务 37 else if (!addWorker(command, false)) 38 // 添加非核心线程失败,会执行reject拒绝策略 39 reject(command); 40 }
标签:excute,队列,流程,任务,添加,command,ctl,线程 From: https://www.cnblogs.com/zhang12345/p/17539126.html