1、添加AsyncConfig配置类,设置线程池信息
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
public static final Logger logger = LoggerFactory.getLogger(AsyncConfig.class);
/**
* 线程数量未达到corePoolSize,则新建一个线程(核心线程)执行任务
* 线程数量达到了corePools,则将任务移入队列等待
* 队列已满,新建线程(非核心线程)执行任务
* 队列已满,总线程数又达到了maximumPoolSize,就会抛出异常
*
* @Author: xxx
* @Date: 2019/9/3
*/
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
/*核心线程数,如果当前运行的线程数小于corePoolSize,那么就创建线程来执行任务*/
executor.setCorePoolSize(10);
/*最大线程数*/
executor.setMaxPoolSize(30);
/*队列大小*/
executor.setQueueCapacity(100);
/*
* 线程池对拒绝任务(无线程可用)的处理策略
* AbortPolicy:丢弃任务,直接抛出java.util.concurrent.RejectedExecutionException异常,默认的策略
* CallerRunsPolicy:这个策略重试添加当前的任务,他会自动重复调用 execute() 方法,直到成功
* DiscardOldestPolicy: 丢弃队列最前面的任务,然后重新尝试执行任务,会导致被丢弃的任务无法再次被执行
* DiscardPolicy:抛弃当前任务;会导致被丢弃的任务无法再次被执行,但是不抛出异常
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
executor.setThreadNamePrefix("AsyncThread-");
logger.info("init async thread pool");
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}