浅析线程池工具类Executors
介绍
Executors 是 Java 中的一个工具类,它位于 java.util.concurrent 包中,提供了几种便捷的方法来创建和管理线程池。它的主要目的是简化线程池的使用,尤其是在不需要特别细致配置的情况下。
尽管 Executors 提供了简单的接口来创建线程池,但它的默认配置并不总是适用于所有场景,特别是在高并发、负载变化较大的情况下,可能会导致性能问题。
Executors提供的方法
1. newFixedThreadPool(int nThreads)
无限队列
- 描述:创建一个固定大小的线程池,线程池中有固定的
nThreads
个线程。 - 特点:所有线程始终处于空闲或工作状态。任务会被提交到队列中,当所有线程都在工作时,新任务会排队等待。
- 适用场景:适用于任务数量固定的情况,且每个任务都需要一个独立的线程来处理。
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
2. newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
无限队列
- 描述:创建一个固定大小的线程池,并使用指定的
ThreadFactory
来创建新线程。 - 特点:与
newFixedThreadPool
相同,但可以自定义线程的创建方式(例如设置线程名称、优先级等)。 - 适用场景:需要自定义线程属性的场景,例如设置线程名称、优先级、Daemon 线程等。
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);}
3. newWorkStealingPool(int parallelism)
- 描述:创建一个支持工作窃取(work-stealing)算法的线程池。线程池中最大线程数由
parallelism
参数指定。 - 特点:适用于高并发任务,能够动态调整线程数,采用工作窃取机制以提高并发性能。
- 适用场景:适用于 CPU 密集型任务,尤其是那些独立并且相互不依赖的任务。
public static ExecutorService newWorkStealingPool(int parallelism) {return new ForkJoinPool(parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
}
4. newWorkStealingPool()
- 描述:创建一个工作窃取线程池,默认的
parallelism
设置为系统可用的处理器数。 - 特点:根据系统的处理器数动态调整线程池大小。
- 适用场景:适用于并行度依赖于 CPU 核心数的任务。
public static ExecutorService newWorkStealingPool() {return new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
}
5. newSingleThreadExecutor()
无限队列
- 描述:创建一个只有单个工作线程的线程池,任务会按顺序执行。
- 特点:所有任务按顺序执行,一个接一个,适用于任务之间有顺序依赖的场景。
- 适用场景:适用于顺序执行的任务,如日志处理、文件系统操作等。
public static ExecutorService newSingleThreadExecutor() {return newSingleThreadExecutor(defaultThreadFactory());
}
6. newSingleThreadExecutor(ThreadFactory threadFactory)
无限队列
- 描述:创建一个单线程的线程池,并使用指定的
ThreadFactory
来创建线程。 - 特点:与
newSingleThreadExecutor
相同,但可以自定义线程的创建方式。 - 适用场景:需要自定义单线程池中线程的属性的场景。
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {return new AutoShutdownDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory));
}
7. newCachedThreadPool()
无限线程
- 描述:创建一个可缓存的线程池,线程池中的线程数会动态变化。
- 特点:如果有空闲线程,新的任务会复用这些线程;如果没有空闲线程,则会创建新线程。空闲线程会在 60 秒后被回收。
- 适用场景:适用于任务执行时间较短、数量变化较大的场景。
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
}
8. newCachedThreadPool(ThreadFactory threadFactory)
无限线程
- 描述:创建一个可缓存的线程池,使用指定的
ThreadFactory
来创建线程。 - 特点:与
newCachedThreadPool
相同,但可以自定义线程的创建方式。 - 适用场景:需要自定义线程池中线程属性的场景。
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory);
}
9. newThreadPerTaskExecutor(ThreadFactory threadFactory)
- 描述:为每个任务创建一个新的线程,线程数没有上限。
- 特点:每个任务都会创建一个新线程,适用于执行单独的、短时间任务。
- 适用场景:适用于每个任务需要独立线程的场景,但如果任务数过多,可能会消耗大量系统资源。
public static ExecutorService newThreadPerTaskExecutor(ThreadFactory threadFactory) {return ThreadPerTaskExecutor.create(threadFactory);
}
10. newVirtualThreadPerTaskExecutor()
虚拟线程
- 描述:为每个任务创建一个新的虚拟线程。虚拟线程是 Java 19 引入的一种轻量级线程,适合处理大量短生命周期的任务。
- 特点:线程的创建和销毁开销较小,适合高并发的轻量任务。
- 适用场景:适用于大量并发的 I/O 密集型任务。
public static ExecutorService newVirtualThreadPerTaskExecutor() {ThreadFactory factory = Thread.ofVirtual().factory();return newThreadPerTaskExecutor(factory);
}
11. newSingleThreadScheduledExecutor()
- 描述:创建一个单线程的调度线程池,用于调度延迟执行或定期执行的任务。
- 特点:任务会按顺序执行,且保证任务是按顺序延迟或定期执行的。
- 适用场景:适用于需要定时执行的单线程任务,如定时任务调度。
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}
12. newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
- 描述:创建一个单线程的调度线程池,并使用指定的
ThreadFactory
创建线程。 - 特点:与
newSingleThreadScheduledExecutor
相同,但可以自定义线程的创建方式。 - 适用场景:需要自定义调度线程的场景。
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1, threadFactory));
}
13. newScheduledThreadPool(int corePoolSize)
- 描述:创建一个可以定期或延迟执行任务的线程池,线程池的大小由
corePoolSize
决定。 - 特点:可以调度任务执行延迟或周期性任务。线程池的大小是
corePoolSize
,即使线程空闲也会保持这些线程。 - 适用场景:适用于周期性任务或定时任务的调度。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);
}
14. newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
- 描述:创建一个带有自定义线程工厂的定时任务线程池。
- 特点:与
newScheduledThreadPool(int corePoolSize)
相同,但使用指定的ThreadFactory
创建线程。 - 适用场景:需要自定义调度线程的场景。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
总结
- 固定线程池 (
newFixedThreadPool
):适合处理任务量固定且每个任务需要独立线程的场景。 - 可缓存线程池 (
newCachedThreadPool
):适合处理短时间的、高并发的任务,尤其是任务数不确定的场景。 - 单线程池 (
newSingleThreadExecutor
):适合处理顺序执行的任务。 - 工作窃取线程池 (
newWorkStealingPool
):适合处理大量 CPU 密集型并行任务。 - 定时任务线程池 (
newScheduledThreadPool
):适合处理定时任务或周期性任务。