spring boot 中配置 @async 异步线程池需启用 @enableasync、定义 threadpooltaskexecutor bean 并初始化,设置核心参数、拒绝策略及线程名前缀,通过 @async 指定线程池,方法须 public 且避免同类调用,参数建议外置 application.yml 管理。

Spring Boot 中配置 @Async 异步线程池,核心是替换掉默认的“伪线程池”(SimpleAsyncTaskExecutor),改用真正可复用、可调优的 ThreadPoolTaskExecutor。默认行为每次调用都新建线程,不适用于生产环境。
必须启用异步支持
在启动类或任意配置类上添加 @EnableAsync 注解,这是整个机制生效的前提:
- 仅加
@Async不生效,必须有@EnableAsync - 建议放在启动类上,避免遗漏;也可单独建配置类保持内聚
- 该注解触发 Spring 对
@Async方法的代理增强
定义自定义线程池 Bean
通过 @Bean 声明一个 ThreadPoolTaskExecutor 实例,并显式初始化(.initialize() 不可省略):
-
corePoolSize:常驻线程数,推荐设为 CPU 核心数 × (1~2),如 4~8 -
maxPoolSize:最大并发线程数,应对突发流量,一般 ≤ 50 -
queueCapacity:任务队列容量,建议设为有限值(如 200),避免 OOM -
threadNamePrefix:设置前缀便于日志识别,如"async-" -
rejectedExecutionHandler:务必指定拒绝策略,推荐CallerRunsPolicy(由调用线程执行)或DiscardPolicy(静默丢弃)
绑定异步方法与线程池
有两种方式指定使用哪个线程池:
- 若只定义一个
ExecutorBean,@Async会自动匹配,无需额外指定 - 若定义多个(如
@Bean("smsExecutor")),需在方法上写@Async("smsExecutor") - 方法必须是 public,且不能在同类中直接调用(否则代理失效,变成同步)
- 返回类型支持
void或Future/CompletableFuture
配合配置文件灵活管理
把线程池参数外移到 application.yml,方便不同环境差异化配置:
async:
executor:
core-pool-size: 8
max-pool-size: 16
queue-capacity: 200
thread-name-prefix: async-
keep-alive-seconds: 60
在配置类中用 @Value 注入,或使用 @ConfigurationProperties 绑定对象,提升可维护性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











