创建线程池最终都会调用下面这个方法
对上面参数做一下简单讲解
corePoolSize 线程池中核心线程数
maximumPoolSize 线程池中最大线程数
keepAliveTime 线程池中空闲线程存活时间
TimeUnit keepAliveTime的单位
workQueue 阻塞队列BlockingQueue 实例
threadFactory 线程工厂, 用于创建线程
handler 线程池的饱和策略
简单介绍下成员变量
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); ctl维护两个概念上的参数:(后29位)workCount和(前三位)runState。workCount表示有效的线程数量,runState表示线程池的运行状态。运行状态只要有五个,分别是RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED 状态值就是只关心前三位的值,所以把后29位清0 private static int runStateOf(int c) { return c & ~CAPACITY; } 线程数量就是只关心后29位的值,所以把前3位清0 private static int workerCountOf(int c) { return c & CAPACITY; } 两个数相或 private static int ctlOf(int rs, int wc) { return rs | wc; } 线程占用的数量 private static final int COUNT_BITS = Integer.SIZE - 3; 最大线程数量 private static final int CAPACITY = (1 << COUNT_BITS) - 1; 线程池运行状态 接受新任务并且处理已经进入队列的任务 private static final int RUNNING = -1 << COUNT_BITS; 不接受新任务但是处理进入队列的任务 private static final int SHUTDOWN = 0 << COUNT_BITS; 不接受新任务不处理进入队列的任务 中断执行的任务 private static final int STOP = 1 << COUNT_BITS; 所有任务执行完成 线程转到了状态TIDYING会执行terminated()钩子方法 private static final int TIDYING = 2 << COUNT_BITS; terminated()已经执行完成 private static final int TERMINATED = 3 << COUNT_BITS; |
线程池的饱和策略 一共有下面四种
static class ThreadPoolExecutor.AbortPolicy
用于被拒绝任务的处理程序,它将抛出 RejectedExecutionException.
static class ThreadPoolExecutor.CallerRunsPolicy
用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。
static class ThreadPoolExecutor.DiscardOldestPolicy
用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试 execute;如果执行程序已关闭,则会丢弃该任务。
static class ThreadPoolExecutor.DiscardPolicy
用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
本文只讲解这些其他的感兴趣自己可以多看看