文章目录
Android线程池源码分析
线程池执行流程图
相关函数
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
workerCountOf
返回值为当前正在执行的runnable
addWorker(Runnable firstTask, boolean core)
runStateOf©;
得到当前线程池运行的状态
if (rs >= SHUTDOWN &&
!(rs == SHUTDOWN &&
firstTask == null &&
! workQueue.isEmpty()))
return false;
直接返回false有以下3种情况:
- 线程池状态为STOP、TIDYING、TERMINATED
- 线程池状态不是running状态,并且firstTask不为空
- 线程池状态不是running状态,并且工作队列为空
当返回false时则进入拒绝策略
int wc = workerCountOf(c);
if (wc >= CAPACITY ||
wc >= (core ? corePoolSize : maximumPoolSize))
return false;
判断是否为核心线程
如果是核心线程,当前的workerCountOf大于corePoolSize则返回false
如果是非核心线程,当前的workerCountOf大于maximumPoolSize则返回false
当返回false时则进入拒绝策略
if (compareAndIncrementWorkerCount(c))
break retry;
该方法将信号量+1,则workerCountOf也会相应的+1;
Worker w = null;
w = new Worker(firstTask);
final Thread t = w.thread;
创建一个work
workers.add(w);
将work添加到队列中去
if (workerAdded) {
t.start();
workerStarted = true;
}
执行work对象里面的Thread
Worker类
一个worker对象可以用于执行一个或多个runnable对象。
Worker(Runnable firstTask)
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
在addWorker方法中创建work对象,在work对象的构造方法中,thread对象为线程池构造函数中传入的ThreadFactory
private static class DefaultThreadFactory implements ThreadFactory {
private sta