@async 不生效的首要原因是未启用异步支持,必须在@configuration类中添加@enableasync;其次需配置自定义threadpooltaskexecutor线程池并命名bean;且方法须为public、不可同类调用、返回void或future子类。

@Async 不生效?先确认是否启用了异步支持
Spring 的 @Async 注解默认不生效,必须显式开启。很多人加了注解但方法仍是同步执行,根本原因就是漏了这一步。
在任意一个 @Configuration 类上添加 @EnableAsync,这是硬性前提:
@Configuration
@EnableAsync
public class AsyncConfig {
}
- 不能只加注解不加
@EnableAsync,哪怕配置了线程池也白搭 -
@EnableAsync必须出现在 Spring 容器能扫描到的配置类里,别放在测试类或工具类中 - 如果项目用了 Spring Boot,也一样要加——自动配置不会帮你开这个开关
为什么自定义线程池比默认的更关键
Spring 默认用 SimpleAsyncTaskExecutor,它不复用线程,每次调用都新建线程,高并发下极易 OOM。真实项目必须配自己的线程池。
推荐用 ThreadPoolTaskExecutor,并在配置类中声明为 @Bean:
@Bean("taskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("async-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
- 必须给 Bean 起名(如
"taskExecutor"),否则@Async找不到它,会退回到默认的错误实现 -
setRejectedExecutionHandler建议设成CallerRunsPolicy,避免任务直接被丢弃 - 不要把
queueCapacity设为Integer.MAX_VALUE,看似“不拒绝”,实则内存涨爆
@Async 方法调用失败的三个高频陷阱
即使开了异步、配了线程池,@Async 仍可能静默失效或抛异常,常见于以下场景:
- 方法不是 public 的——
@Async只支持 public 方法,private / protected / package-private 全部忽略 - 在同一个类内调用——比如 A 方法加了
@Async,B 方法里直接this.A(),此时没有代理介入,完全同步执行 - 返回类型不是
void或Future子类(如CompletableFuture)——Spring 无法包装异步结果,会报java.lang.IllegalArgumentException: @Async method must return void or Future
补救方式:拆到另一个 @Service 类里调用,或通过 ApplicationContext 拿到代理对象再调。
CompletableFuture 与 @Async 混用时的注意事项
想链式处理异步结果?别直接在 @Async 方法里 return CompletableFuture.supplyAsync(...)——这等于套了两层异步,线程池可能错乱,且异常难以捕获。
- 正确做法:让
@Async方法本身返回CompletableFuture,内部用同步逻辑构造,例如return CompletableFuture.completedFuture(doWork()) - 如果真要用
supplyAsync,务必指定线程池参数,例如supplyAsync(() -> ..., taskExecutor),否则走 ForkJoinPool,和你的配置无关 -
@Async+CompletableFuture组合后,异常不会自动抛给调用方,需手动.exceptionally()或.handle()处理
异步的复杂性不在开关,而在边界——谁创建线程、谁捕获异常、谁决定超时、谁负责重试。这些事 @Async 一个都不管,全得你写清楚。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











