构造函数:
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数含义:
corePoolSize 线程池里面保存的最多可以闲置的线程数量。 allowCoreThreadTimeOut被调用后,则没有线程能够在timeout后还保存在线程池里
maximumPoolSize 线程池里面保存最多的线程数量
keepAliveTime, unit 当线程池里面保存的线程数量大于corePoolSize后,闲置的线程等待最大指定的时间(然后被关闭)
workQueue 用来保存被提交的任务
threadFactory 用来创建新线程的factory
handler 当所有线程都在执行任务并且workQueue已经满了,handler处理新提交进来的任务
JDK 自带的 RejectedExecutionHandler 实现有4个:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy, DiscardPolicy。
AbortPolicy 是默认策略直接 throw RejectedExecutionException
CallerRunsPolicy 当Executor没有被关闭,则直接由提交任务的线程直接运行
DiscardOldestPolicy 当Executor没有被关闭,从workQueue里面删除等待最久的一个任务,然后再调用execute
DiscardPolicy 当前任务被直接抛弃
ThreadPoolExecutor 的 AtomicInteger ctl 属性很有意思,是一个32位的 AtomicInteger 。在最高3位存储了当前 ThreadPoolExecutor 的状态,后面29位用于存储当前线程的数量。所以在很多 ThreadPoolExecutor 的方法调用里面,CAS操作要求状态和线程的数量都是所期望的,才能进行后面的操作。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 00000000000000000000000000000000 private static final int COUNT_BITS = Integer.SIZE - 3; private static final int CAPACITY = (1 << COUNT_BITS) - 1; // 00011111111111111111111111111111 // runState is stored in the high-order bits private static final int RUNNING = -1 << COUNT_BITS; // 11100000000000000000000000000000 private static final int SHUTDOWN = 0 << COUNT_BITS; // 00000000000000000000000000000000 private static final int STOP = 1 << COUNT_BITS; // 00100000000000000000000000000000 private static final int TIDYING = 2 << COUNT_BITS; // 01000000000000000000000000000000 private static final int TERMINATED = 3 << COUNT_BITS; // 01000000000000000000000000000000 // 获取当前的状态 private static int runStateOf(int c) { return c & ~CAPACITY; } // 获取当前的线程数量 private static int workerCountOf(int c) { return c & CAPACITY; } // 合并状态和线程数量 private static int ctlOf(int rs, int wc) { return rs | wc; }
其他属性:
volatile RejectedExecutionHandler handler BlockingQueue<Runnable> workQueue // 用来存储提交的任务。一般是使用 LinkedBlockingQueued HashSet<Worker> workers // 工作线程抽象成了 Worker long completedTaskCount // 完成任务的数量 ReentrantLock mainLock = new ReentrantLock() // 在需要访问 workers,completedTaskCount 时候需要先获取 mainLock。包括在添加 Worker,中断线程,关闭线程池等时候 Condition termination = mainLock.newCondition() // 用来等待线程池 volatile int corePoolSize // 核心线程的最大数量 volatile int maximumPoolSize // 所有线程的最大数量 volatile long keepAliveTime // 非核心线程的超时时间 volatile boolean allowCoreThreadTimeOut // 是否让核心线程也超时。默认为 false,即核心线程永远存活,直到关闭线程池。如果调用void allowCoreThreadTimeOut(boolean value)设置为 true, 即核心线程 idle 超过 keepAliveTime 时间以后,也会被关闭 volatile ThreadFactory threadFactory // 用来创建线程的工厂
Java ThreadPoolExecutor 学习笔记(二)
Java ThreadPoolExecutor 学习笔记(三)