Java 创建线程池的几种方式
在 Java 中创建线程池主要通过 java.util.concurrent
包下的 ExecutorService
接口及其实现类。以下是创建线程池的几种常见方式:
✅ 1. 使用 Executors
工具类(最简单)
ExecutorService executor = Executors.newFixedThreadPool(10);
常用方法说明:
方法 | 描述 |
---|---|
Executors.newFixedThreadPool(int nThreads) | 固定大小线程池,适合负载稳定场景 |
Executors.newSingleThreadExecutor() | 单线程池,串行执行任务 |
Executors.newCachedThreadPool() | 缓存线程池,线程可复用,适合执行大量短期异步任务 |
Executors.newScheduledThreadPool(int corePoolSize) | 支持定时与周期性任务调度的线程池 |
⚠️ 缺点:Executors
默认线程池队列大小是无界的,可能导致 OOM,不推荐在生产中直接使用。
✅ 2. 使用 ThreadPoolExecutor
构造函数(推荐)
ExecutorService executor = new ThreadPoolExecutor(4, // corePoolSize10, // maximumPoolSize60, // keepAliveTimeTimeUnit.SECONDS, // keepAliveTime 单位new LinkedBlockingQueue<>(100), // 工作队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
参数详解:
-
corePoolSize
:核心线程数 -
maximumPoolSize
:最大线程数 -
keepAliveTime
:非核心线程最大空闲时间 -
workQueue
:任务队列(如LinkedBlockingQueue
,ArrayBlockingQueue
) -
threadFactory
:自定义线程工厂 -
handler
:任务拒绝策略(如下所示)
常见拒绝策略:
策略类 | 描述 |
---|---|
AbortPolicy | 默认策略,抛出异常 |
CallerRunsPolicy | 谁提交谁执行 |
DiscardPolicy | 直接丢弃任务 |
DiscardOldestPolicy | 丢弃队列头部任务,尝试再次执行当前任务 |
✅ 3. 使用 ScheduledExecutorService
(定时/周期任务)
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);scheduler.schedule(() -> {System.out.println("延迟3秒执行");
}, 3, TimeUnit.SECONDS);scheduler.scheduleAtFixedRate(() -> {System.out.println("每5秒执行一次");
}, 1, 5, TimeUnit.SECONDS);
✅ 4. 使用 Spring 提供的 ThreadPoolTaskExecutor
(在 Spring Boot 中)
@Configuration
public class ThreadPoolConfig {@Beanpublic ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(50);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix(\"MyExecutor-\");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}
🔚 总结推荐
需求 | 推荐方式 |
---|---|
简单临时使用 | Executors.newFixedThreadPool |
可控、适合生产 | 自定义 ThreadPoolExecutor |
定时任务调度 | ScheduledExecutorService |
Spring 项目中 | ThreadPoolTaskExecutor |
如果你希望我为你封装一份线程池模板代码(带监控、日志、自定义命名、注释),也可以告诉我,我来写。
Java 创建线程池的几种方式 – 菜鸟-创作你的创作