1 //添加工作线程 2 private boolean addWorker(Runnable firstTask, boolean core) { 3 // 对线程池状态的判断以及对工作线程数量的判断 4 // 外层for循环的标识 5 retry: 6 for (;;) { 7 // 获取ctl值 8 int c = ctl.get(); 9 // 拿到线程池的状态 10 int rs = runStateOf(c); 11 12 // 如果当前线程状态不是RUNNING,再次做后续判断,查看当前任务是否可以不处理 13 if (rs >= SHUTDOWN && 14 // 线程池状态为SHUTDOWN,并且任务为空,并且工作队列不为空 15 // 如果同时满足了这三个要求,那就是要处理工作队列当前中的任务 16 ! (rs == SHUTDOWN && 17 firstTask == null && 18 ! workQueue.isEmpty())) 19 // 只要不是RUNNING状态,不处理新任务 20 // 如果是SHUTDOWN状态,并且满足了之前addWorker(null,false),并且工作队列有任务时,需要创建线程 21 return false; 22 23 for (;;) { 24 // 获取当前工作线程数 25 int wc = workerCountOf(c); 26 // 判断工作线程是否大于最大值 27 if (wc >= CAPACITY || 28 // 如果是核心线程,是否大于设置的corePoolSize 29 // 如果是非核心线程,是否大于maximumPoolSize 30 wc >= (core ? corePoolSize : maximumPoolSize)) 31 // 当前工作线程已经达到最大值 32 return false; 33 // 以CAS对工作线程数+1,如果成功,直接跳出外层for循环 34 if (compareAndIncrementWorkerCount(c)) 35 // 跳出外层for循环 36 break retry; 37 // 重新获取ctl 38 c = ctl.get(); // Re-read ctl 39 // 基于新获取的ctl拿到线程池状态,判断和之前的rs状态是否一致 40 if (runStateOf(c) != rs) 41 // 说明并发操作导致线程池状态变化,需要重新判断状态 42 continue retry; 43 // else CAS failed due to workerCount change; retry inner loop 44 } 45 } 46 47 // 添加工作线程并启动工作线程 48 // 工作线程是否启动 49 boolean workerStarted = false; 50 // 工作线程是否添加 51 boolean workerAdded = false; 52 // Worker就是工作线程 53 ThreadPoolExecutor.Worker w = null; 54 try { 55 // new Worker构建工作线程,将任务扔到了Worker中 56 w = new ThreadPoolExecutor.Worker(firstTask); 57 // 拿到了Worker中绑定的Thread线程 58 final Thread t = w.thread; 59 if (t != null) { 60 // 加锁 61 final ReentrantLock mainLock = this.mainLock; 62 mainLock.lock(); 63 try { 64 // 重新获取ctl,拿到线程池的状态 65 int rs = runStateOf(ctl.get()); 66 // 如果满足线程池状态为RUNNING,就添加工作线程 67 if (rs < SHUTDOWN || 68 // 如果线程池状态为SHUTDOWN并且传入的任务为null 69 (rs == SHUTDOWN && firstTask == null)) { 70 // 开始添加工作线程 71 // 判断当前线程是否 处于run状态(健壮性判断) 72 if (t.isAlive()) // precheck that t is startable 73 throw new IllegalThreadStateException(); 74 // 将构建好的worker对象添加到worklers 75 workers.add(w); 76 // 获取工作线程个数 77 int s = workers.size(); 78 // 记录工作线程最大值,如果现在的工作线程数大于历史最大值 79 if (s > largestPoolSize) 80 largestPoolSize = s; 81 // 将工作线程添加的标识设置为true 82 workerAdded = true; 83 } 84 } finally { 85 // 释放锁 86 mainLock.unlock(); 87 } 88 // 只要添加工作线程成功,启动线程 89 if (workerAdded) { 90 t.start(); 91 // 将工作线程启动的标识设置为true 92 workerStarted = true; 93 } 94 } 95 } finally { 96 if (! workerStarted) 97 // 如果启动工作线程失败,做的补救操作 98 // 判断之前创建工作线程是否成功,如果成功,将workers中当前工作线程移除 99 // 将工作线程数减一 100 // 尝试将线程池状态变为TIDYING 101 addWorkerFailed(w); 102 } 103 return workerStarted; 104 }
标签:状态,rs,工作,添加,线程,SHUTDOWN,ctl,addWorker From: https://www.cnblogs.com/zhang12345/p/17540119.html