Spring 提供了开箱即用的异步支持:
@EnableAsync:开启异步线程@Async:标记异步方法
一,开启异步功能
@Configuration
@EnableAsync
public class AsyncConfig {
}
@EnableAsync 会导入:
AsyncConfigurationSelector
最终注册一个关键 Bean:
AsyncAnnotationBeanPostProcessor
这个类负责:扫描 @Async 方法 → 创建代理 → 替换原 Bean
二,写一个异步方法
@Service
public class OrderService {
@Async
public void createOrder() {
System.out.println(Thread.currentThread().getName());
}
}
调用:
orderService.createOrder();
输出:
task-1
说明已经切到线程池。
三,配置异步线程池
3.1 默认线程池
如果你不配置线程池:
Spring 会使用:SimpleAsyncTaskExecutor
- 这不是线程池!!!
它的特点:
- 每次都 new 一个线程
- 不复用线程
- 不限数量
生产环境绝对不能用。
3.2 配置线程池
应该自己配置 ThreadPoolTaskExecutor
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean("myExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5); // 核心线程
executor.setMaxPoolSize(10); // 最大线程
executor.setQueueCapacity(100); // 队列大小
executor.setKeepAliveSeconds(60); // 空闲时间
executor.setThreadNamePrefix("async-");
executor.initialize();
return executor;
}
}
使用:
@Async("myExecutor")
public void createOrder() {
}
四,返回值
4.1 无返回值
@Async
public void sendEmail() {
}
异常不会抛到调用方!
4.2 有返回值
有返回值则,必须返回:
Future
CompletableFuture
ListenableFuture
推荐:
@Async
public CompletableFuture<String> test() {
return CompletableFuture.completedFuture("ok");
}
五,底层原理
核心组件:AsyncAnnotationBeanPostProcessor
执行流程:
Bean 创建
↓
发现 @Async
↓
创建代理对象
↓
方法调用时
↓
AsyncExecutionInterceptor
↓
提交到线程池
本质是:AOP + 线程池
六,SpringBoot 自动配置
在 Spring Boot 中:
自动装配类:TaskExecutionAutoConfiguration
默认 Bean 名称:applicationTaskExecutor
可在 application.yml 配置:
spring:
task:
execution:
pool:
core-size: 5
max-size: 10
queue-capacity: 100