再来进一步看看
addWorker最主要的工作就是w = new Worker(firstTask) 即新开线程。
具体分为两部分,第一部分检验线程池的状态和增加工作线程数
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)) //②
break retry;
c = ctl.get(); // Re-read ctl
if (runStateOf(c) != rs)
continue retry;
// else CAS failed due toworkerCount change; retry inner loop
}
}
分析:①这里单独看起来比较难以理解
if (rs >= SHUTDOWN &&
! (rs == SHUTDOWN &&
firstTask == null &&
! workQueue.isEmpty()))
return false; //新增线程失败
先反过来理解:将不符合return
false的条件(也就是继续往下执行即符合新增线程的条件)拆分一下:
一、rs < SHUTDOWN,好理解即线程池状态为RUNNING
二、(rs ==
SHUTDOWN && firstTask == null && ! workQueue.isEmpty()),怎么理解呢?
这需要结合上面execute方法,当线程池中工作线程数为空,addWorker(null,
false)新开一个任务为空的线程,不是为了执行新任务,而是只是为了执行队列中的任务,这就好理解多了。如上的条件即翻译成:线程池为 SHUTDOWN时,任务为空且队列不为空时,需要继续往下执行。场景就是:当线程池为SHUTDOWN时,不再接受新任务,但还需要继续执行队列中已添加的任务。
这时候再顺过来,突然发现也很好理解
一、rs > SHUTDOWN线程池为STOP、TIDYING、TERMINATED,直接return false
二、rs == SHUTDOWN线程池为SHUTDOWN时:
1、firstTask != null 即新增的任务 ==》return false(不接受新任务)
2、workQueue.isEmpty()即任务队列为空(==》return false(队列中没有需要执行的任务了)
addWorker的第二部分的源码相对简单,主要就是:
w = new Worker(firstTask);
t.start();
若start失败,则addWorkerFailed()
start()启动调用的就是当前Worker的run
->runWorker(),run又继续调用当前Worker的runWorker方法。
网友评论