方式 一、@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;
    }
}