在 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, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.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 {
@Bean
public 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 |
如果你希望我为你封装一份线程池模板代码(带监控、日志、自定义命名、注释),也可以告诉我,我来写。
发表回复