方式 一、@Async注解
1.启动类需要添加@EnableAsync注解
2.需要修改为异步的方法上添加注解@Async
其中,@Async默认使用线程池,一般项目中要指定自定义线程池 @Async(“commonExecutor”)
非常重要:如果在同一个类中调用了注解为@Async的方法,不会有异步的效果。原因是@Async通过aop代理实现,被注解标识的方法会动态生成一个子类-即代理类,所以正确调用该方法的时候调用的是子类,而同一个类中进行调用,通过当前对象去调用的是原本的类。
方式 二、CompletableFuture
使用CompletableFuture执行异步方法,其中executor是自定义线程池,可以通过下面方法注入
@Autowired
@Qualifier("commonExecutor")
private Executor executor;
CompletableFuture.allOf(yourList.stream().map(you ->
CompletableFuture.runAsync(() -> {
// 执行方法
}, executor)
).toArray(CompletableFuture[]::new)).join();
线程池:
@Configuration
public class ThreadConfig {
@Bean("commonExecutor")
public ThreadPoolTaskExecutor commonExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(20);
// 最大线程数
executor.setMaxPoolSize(30);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(60);
// 队列容量
executor.setQueueCapacity(100);
// 拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 设置默认线程名称
executor.setThreadNamePrefix("commonExecutor-");
return executor;
}
}