Excutors与ThreadPoolExcutors有何内在联系与本质差异?
摘要:先说结论。 线程池的创建分为两种: Executors ThreadPoolExecutor Executors 是一个线程池的工具类,而 ThreadPoolExecutor 是 Executors 的具体实现。ThreadPoolExe
先说结论。
线程池的创建分为两种:
Executors
ThreadPoolExecutor
Executors 是一个线程池的工具类,而 ThreadPoolExecutor 是 Executors 的具体实现。ThreadPoolExecutor 是 Executor 接口的一个实现,是线程池的核心类。Executors 工具类提供了很多方法来创建不同类型的线程池,比如 newFixedThreadPool(创建固定线程数的线程池)、newCachedThreadPool(创建缓冲线程池)、newSingleThreadPool(创建只有一个线程的线程池)等,但内部都是通过构造 ThreadPoolExecutor 的不同参数实例来构造线程池的。
所以 Executors 适用于想快速创建一个线程池而不在意内部实现的场景,而 ThreadPoolExecutor 更为灵活可控,可自定义创建拥有特定配置的线程池。
说完的结论再来详细说说 Executors 和 ThreadPoolExecutor。
Executors
Executors 创建线程池的方式有以下几种:
Executors.newFixedThreadPool:创建固定大小的线程池
Executors.newWorkStealingPool:创建抢占式线程池
Executors.newSingleThreadExecutor:创建单个线程的线程池
Executors.newCachedThreadPool:创建可缓存的线程池
Executors.newSingleThreadScheduledExecutor:创建单线程可执行延迟任务的线程池
Executros.newScheduledThreadPool:创建可执行延迟任务的线程池
可以看下源码:
public class Executors {
/**
* 创建可重用的固定数量的线程池。如果所有线程都处在活动状态,提交额外任务
* 的时候,超出的线程在队列中等待。队列类型是 LinkedBlockingQueue
* nThreads 为创建线程池的数量
*/
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
/**
* Java 8 新增的线程池,具有抢占式操作的线程池,每个线程都有一个任务队列存放任务,
* 当线程发现自己的队列没有任务了,也就是先工作完了的线程就去帮助没处理完的线程工作。
* 以实现最快完成工作。
* 是基于 ForkJoinPool 创建的线程池,parallelism 参数自定义并行度。
*/
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool
(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
/**
* 同上,但是并行度是根据获取当前系统的 CPU 核心数来判断。
*/
public static ExecutorService newWorkStealingPool() {
return new ForkJoinPool
(Runtime.getRuntime().availableProcessors(),
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
/**
* 创建固定数量线程的线程池,可控制线程最大并发数,超出的线程会在队列中等待。
