addWorker()主要分两个部分:
第一部分双重循环的目的是判断线程池的状态,若是当前线程池可以创建线程则通过 CAS 操作增加线程数;
第二部分主要是把并发安全的任务加到 workers 里面,并且启动任务执行
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;