线程池ThreadPoolExecutor学习总结
1.ThreadPoolExecutor构造方法参数解释
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
- corePoolSize 核心线程数量
- maximumPoolSize 最大线程数量
- keepAliveTime 空闲时非核心线程存活时间
- unit 存活时间的单位,枚举参数
- work Queue 存储任务的队列
2.Executors工厂类的四种线程池
-
newFixedThreadPool(int nThreads);
return newThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())ding;
定长线程池,以固定的线程数量运行,当任务提交数量超出容量,会把任务塞进无限长的队列中。适合用于削峰、长期运行固定数量的任务。
-
newSingleThreadExecutor()
return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));
单线程版的定长线程池,一次只能执行一个任务,其他任务只能塞进队列。
-
newCachedThreadPool()
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
缓存线程池,当没有任务执行时,线程会在一分钟后关闭。当提交任务时,会立刻起一个线程去执行,可以起Integer的最大值的线程数量。适合执行短期、且数量大的小任务。
-
newScheduledThreadPool(int corePoolSize)
return new ScheduledThreadPoolExecutor(corePoolSize); -------------------------------------------------------------- public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }
计划线程池,用于执行定时任务,可以指定何时启动线程以及一定的周期循环执行线程。比较适合替代Timer工具类。
3.线程池执行规则
- 当任务数量小于核心线程数量(corePoolSize)时,新任务进来时,任务提交给核心线程执行(核心线程常驻于线程池,假如不指定空闲超时时间,不会自动销毁,无论有没有任务执行)。
- 当任务数量大于核心线程数量,新任务提交时,优先暂存进队列。
- 当任务数量大于核心线程数量,且队列已经满了,新任务提交时,如果此时线程总数小于最大线程数量(maximumPoolSize)会另起一个非核心线程来执行新任务,非核心线程执行任务完毕后,如果在指定时间内空闲,会自动销毁。
- 当任务数量大于最大线程数量,新任务提交时,会被线程池拒绝,并抛出异常