在 Java 中,Executor / ExecutorService 是用来管理线程池和执行任务的。配置方式主要取决于你使用的是 JDK 原生 API 还是 Spring 框架。下面分场景说明。
Executors(快捷方式,不推荐生产)ExecutorService executor = Executors.newFixedThreadPool(10);
常见方法:
newFixedThreadPool(n):固定线程数newCachedThreadPool():线程可复用、无线程数限制newSingleThreadExecutor():单线程newScheduledThreadPool(n):定时任务⚠️ 问题:可能创建无界队列或无限线程,容易导致 OOM
ThreadPoolExecutor(手动配置)ThreadPoolExecutor executor = new ThreadPoolExecutor(
10, // 核心线程数
50, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000), // 任务队列
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
| 参数 | 说明 |
|---|---|
| corePoolSize | 核心线程数 |
| maximumPoolSize | 最大线程数 |
| keepAliveTime | 非核心线程空闲存活时间 |
| workQueue | 任务队列 |
| threadFactory | 线程创建工厂 |
| rejectedExecutionHandler | 拒绝策略 |
AbortPolicy(默认,抛异常)CallerRunsPolicy(调用者线程执行)DiscardPolicy(直接丢弃)DiscardOldestPolicy(丢弃最老任务)@Async + ThreadPoolTaskExecutor@Configuration
@EnableAsync
public class ExecutorConfig {
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(1000);
executor.setThreadNamePrefix("async-");
executor.setRejectedExecutionHandler(
new ThreadPoolExecutor.CallerRunsPolicy()
);
executor.initialize();
return executor;
}
}
使用:
@Async
public void doTask() {
// 异步执行
}
@Bean
public Executor scheduledExecutor() {
return Executors.newScheduledThreadPool(5);
}
corePoolSize = CPU 核数corePoolSize = CPU 核数 * 2❌ 使用 Executors.newCachedThreadPool() 处理高并发
❌ 队列无限大
❌ 忘记 initialize()(Spring 中)
❌ 不设置拒绝策略
如果你有具体使用场景(如 Web 请求、定时任务、批量处理),我可以给你更合适的配置示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。