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); } /** * 创建固定数量线程的线程池,可控制线程最大并发数,超出的线程会在队列中等待。
阅读全文