- private boolean addWorker(Runnable firstTask, boolean core) {
- retry: // 循环标志
for (;;) { 死循环
- int c = ctl.get();// 获取状态位
- int rs = runStateOf(c);// 计算线程池的状态
- // Check if queue empty only if necessary.
- if (rs>= SHUTDOWN &&
- ! (rs == SHUTDOWN &&
- firstTask == null &&
- ! workQueue.isEmpty()))
- return false;// 这一段说的是线程池不能正常运行的情况: 线程池状态关闭任务为空队列为空返回错误
- for (;;) {// 死循环
- int wc = workerCountOf(c);// 计算线程数
- if (wc>= CAPACITY ||
- wc>= (core ? corePoolSize : maximumPoolSize))
- return false;// 如果线程数超出核心线程数, 返回错误
- if (compareAndIncrementWorkerCount(c))// 增加 worker 的数量
- break retry;// 回到进入该方法的循环状态
- c = ctl.get(); // Re-read ctl
- if (runStateOf(c) != rs)
- continue retry;// 如果状态发生改变, 就回退
- // else CAS failed due to workerCount change; retry inner loop
- }
- }
- boolean workerStarted = false;// 线程是否开始运行
- boolean workerAdded = false;//worker 是否添加成功
- Worker w = null;
- try {
- w = new Worker(firstTask);// 封装成 worker
- final Thread t = w.thread;
- if (t != null) {
- final ReentrantLock mainLock = this.mainLock;// 加锁
- mainLock.lock();
- try {
- // Recheck while holding lock.
- // Back out on ThreadFactory failure or if
- // shut down before lock acquired.
int rs = runStateOf(ctl.get()); 计算线程池状态
- if (rs <SHUTDOWN ||
- (rs == SHUTDOWN && firstTask == null)) {
- if (t.isAlive()) // precheck that t is startable
- throw new IllegalThreadStateException();
- workers.add(w);
- int s = workers.size();
- if (s> largestPoolSize)
- largestPoolSize = s;
- workerAdded = true;//worker 添加成功
- }
- } finally {
- mainLock.unlock();
- }
- if (workerAdded) {
- t.start();// 启动刚刚添加的任务
- workerStarted = true;
- }
- }
- } finally {
- if (! workerStarted)
- addWorkerFailed(w);// 失败后执行的操作
- }
- return workerStarted;
- }
来源: https://www.cnblogs.com/10158wsj/p/8620200.html