@Async 注解需配合@EnableAsync启用并委托给容器中配置的TaskExecutor执行,推荐使用ThreadPoolTaskExecutor自定义线程池,避免默认SimpleAsyncTaskExecutor;方法须为public、不可自调用、不可static/final,返回void或Future,可指定线程池名。

Spring 的 @Async 注解本身不直接开启线程池,而是**委托给 Spring 容器中配置的 TaskExecutor** 来执行异步方法。你需要显式配置一个线程池 Bean,否则 Spring 会回退到默认的简单线程池(`SimpleAsyncTaskExecutor`),它**不复用线程、无队列、每次新建线程**,不适合生产环境。
必须开启 @EnableAsync
在任意一个配置类或启动类上添加该注解,启用 Spring 的异步方法代理支持:
@EnableAsync
public class AsyncConfig { }
定义并注册自定义线程池 Bean
推荐使用 ThreadPoolTaskExecutor,它是 Spring 对 java.util.concurrent.ThreadPoolExecutor 的封装,支持优雅关闭、指标暴露等:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Configuration
public class AsyncConfig {
@Bean("taskExecutor")
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("async-task-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
}
@Async 方法的使用限制
- 必须是 public 方法(CGLIB 代理要求)
- 不能在同一个类中自调用(如
this.method()),因为代理对象未生效 - 方法不能有
static或final修饰符 - 返回值建议为
void或Future<?>;若需获取结果,用CompletableFuture更灵活
指定线程池执行器(可选但推荐)
当容器中有多个 TaskExecutor Bean 时,可通过名称指定:
@Async("taskExecutor")
public void sendEmail(String to) {
// 发送邮件逻辑
}
如果不指定,默认使用名为 taskExecutor 的 Bean;若没有,则 fallback 到 SimpleAsyncTaskExecutor。

















