1. 启动类上要加开启异步方法的注解
@EnableAsync
2. 线程池配置
@EnableAsync
@Configuration
public class ThreadPoolConfig {
/**
* 初始化对象
*
* @return 线程池属性配置对象
*/
@Bean
@ConfigurationProperties(prefix = "async.thread.pool")
public AsyncThreadPoolProperties asyncThreadPoolProperties() {
return new AsyncThreadPoolProperties();
}
/**
* 创建异步线程池<br>
* 使用异步线程池时,请指定bean名称<br>
* @param threadPoolProperties 线程池属性配置对象
* @return 线程池
*/
@Bean(SystemConstant.ASYNC_THREAD_POOL)
public Executor asyncThreadPoolExecutor(AsyncThreadPoolProperties threadPoolProperties) {
return getQueryExecutor(threadPoolProperties);
}
private Executor getQueryExecutor(AsyncThreadPoolProperties threadPoolProperties) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(threadPoolProperties.getCorePoolSize());
executor.setMaxPoolSize(threadPoolProperties.getMaxPoolSize());
executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());
executor.setThreadNamePrefix(threadPoolProperties.getThreadNamePrefix());
//关闭程序时,等待任务完成
executor.setWaitForTasksToCompleteOnShutdown(true);
//系统柜关闭等待中断时间。此处默认写死,不外部传值
executor.setAwaitTerminationSeconds(10);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new CallerRunsPolicy());
//必须初始化
executor.initialize();
return executor;
}
/**
* 异步线程池属性配置
*/
@Getter
@Setter
@NoArgsConstructor
static class AsyncThreadPoolProperties {
/**
* 核心线程池数量
*/
private int corePoolSize;
/**
* 最大线程池数量
*/
private int maxPoolSize;
/**
* 队列最大容量
*/
private int queueCapacity;
/**
* 线程名称前缀
*/
private String threadNamePrefix;
}
}
3. 定义异步线程池常量
// 异步线程池-可以用于活动类业务查询
public static final String ASYNC_THREAD_POOL = "asyncThreadPoolExecutor";
4. 方法上需要标明异步方法
@Async("这里是异步线程池名称")
public void saveData(DataDTO req) {}