持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情
ThreadPoolExecutor核心数据结构
ThreadPoolExecutor的核心数据结构和变量部分源码如下:
public class ThreadPoolExecutor extends AbstractExecutorService {
......
private final Condition termination = mainLock.newCondition();
private int largestPoolSize;
private long completedTaskCount;
private volatile ThreadFactory threadFactory;
private volatile RejectedExecutionHandler handler;
private volatile long keepAliveTime;
private volatile boolean allowCoreThreadTimeOut;
private volatile int corePoolSize;
private volatile int maximumPoolSize;
private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();
private static final RuntimePermission shutdownPerm =
new RuntimePermission("modifyThread");
private final AccessControlContext acc;
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
{
private static final long serialVersionUID = 6138294804551838833L;
final Thread thread;
Runnable firstTask;
volatile long completedTasks;
Worker(Runnable firstTask) {
//设置AQS中的state为-1,在runWorker方法调用前不允许中断。
setState(-1);
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
}
}
mainLock.newCondition()方法:支持awaitTerminate的等待条件,即外部可以通过这个条件变量来等待线程池termination。
largestPoolSize变量:用于追踪线程池中出现最大的线程数,需要上mainLock锁访问。
completedTaskCount变量:统计线程已经执行完成的任务数,这个值只在worker线程终结时进行更新,需要上mainLock锁访问。
volatile ThreadFactory threadFactory变量:用户自定义的所有后边梁都可以通过volatile来修饰,保证了线程的可见性,创建线程的工厂。
volatile RejectedExecutionHandler handler变量:线程池饱和后执行的拒绝执行策略。
volatile long keepAliveTime变量:线程创建后在线程池中的保活时长,由于线程创建后会消耗操作系统的资源,因此这个变量用于控制线程在空闲多久被回收。
allowCoreThreadTimeOut变量:是否允许核心线程数超时回收,默认是false。
corePoolSize变量:核心线程数大小。
maximumPoolSize变量:最大线程数大小。
new AbortPolicy()方法:线程池饱和后默认的拒绝策略。
new RuntimePermission("modifyThread")方法:设置shutdown和shutdownNow调用方所需的权限。
AccessControlContext acc变量:执行终结器时要使用的上下文。
Worker类:用于封装线程和执行任务,该类继承了AQS,说明具有同步器的特性。
Thread thread变量:worker运行的线程对象,由用户提供的TheadFactory创建。
Runnable firstTask变量:初始执行的任务,可能为null。
completedTasks变量:当前woker执行完成的任务数。