java.util.concurrent.Executors
是一个工厂类,提供了一些静态方法来创建各种类型的线程池。这些方法简单易用,可以快速创建常见的线程池类型。以下是 Executors
提供的主要创建线程池的方法及其特性:
1. newFixedThreadPool(int nThreads)
创建一个固定大小的线程池。线程池包含固定数量的线程,这些线程在整个生命周期中保持不变。如果所有线程都在忙于执行任务,其他任务将在队列中等待。
特点:
- 固定数量的线程。
- 适用于负载较为稳定的场景。
java复制代码
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
2. newCachedThreadPool()
创建一个可根据需要创建新线程的线程池。如果线程池中的线程在前一次任务执行后60秒内没有被复用,那么该线程将被终止并从池中移除。当执行很多短期异步任务时,可以提高程序性能。线程池规模不固定,可以根据需求自动调整大小。
特点:
- 线程数量动态扩展。
- 适用于执行大量短期任务的场景。
java复制代码
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
3. newSingleThreadExecutor()
创建一个单线程的线程池。此线程池只有一个线程,所有任务将被顺序执行。适用于需要保证任务按顺序执行的场景。
特点:
- 单个线程,保证任务顺序执行。
- 适用于需要顺序执行任务的场景。
java复制代码
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
4. newScheduledThreadPool(int corePoolSize)
创建一个线程池,可以定期或延时执行任务。适用于需要定时任务或延时任务的场景。
特点:
- 定期或延时执行任务。
- 支持固定数量的线程。
java复制代码
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
5. newSingleThreadScheduledExecutor()
创建一个单线程的调度线程池。类似于 newSingleThreadExecutor()
,但具有调度功能,可以定期或延时执行任务。
特点:
- 单个线程,保证任务按顺序执行。
- 支持定期或延时任务。
java复制代码
ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
例子
以下是如何使用这些方法创建和使用线程池的示例:
java复制代码
import java.util.concurrent.*; public class ExecutorsExample { public static void main(String[] args) { // newFixedThreadPool example ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); submitTasks(fixedThreadPool, "FixedThreadPool"); // newCachedThreadPool example ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); submitTasks(cachedThreadPool, "CachedThreadPool"); // newSingleThreadExecutor example ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); submitTasks(singleThreadExecutor, "SingleThreadExecutor"); // newScheduledThreadPool example ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2); scheduleTasks(scheduledThreadPool, "ScheduledThreadPool"); // newSingleThreadScheduledExecutor example ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor(); scheduleTasks(singleThreadScheduledExecutor, "SingleThreadScheduledExecutor"); } private static void submitTasks(ExecutorService executorService, String poolName) { for (int i = 0; i < 5; i++) { final int taskId = i; executorService.submit(() -> { System.out.println(poolName + " executing task " + taskId + " on thread " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } executorService.shutdown(); } private static void scheduleTasks(ScheduledExecutorService scheduledExecutorService, String poolName) { for (int i = 0; i < 5; i++) { final int taskId = i; scheduledExecutorService.schedule(() -> { System.out.println(poolName + " executing task " + taskId + " on thread " + Thread.currentThread().getName()); }, 2, TimeUnit.SECONDS); } scheduledExecutorService.shutdown(); } }
总结
Executors
工厂类提供了便捷的方法来创建常见类型的线程池:
newFixedThreadPool
:固定大小的线程池,适用于负载较为稳定的场景。newCachedThreadPool
:可根据需要创建新线程的线程池,适用于执行大量短期异步任务。newSingleThreadExecutor
:单线程的线程池,适用于需要顺序执行任务的场景。newScheduledThreadPool
:支持定期或延时任务的线程池,适用于需要定时任务的场景。newSingleThreadScheduledExecutor
:单线程的调度线程池,适用于需要顺序执行定期或延时任务的场景。
这些方法提供了简单易用的接口,可以满足各种常见的并发编程需求。