首先创建线程池
@EnableAsync
@Configuration
@Component
public class TaskPoolConfig {
@Bean("taskExecutor")
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数:线程池创建时候初始化的线程数
executor.setCorePoolSize(5);
// 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
executor.setMaxPoolSize(20);
// 缓冲队列:用来缓冲执行任务的队列
executor.setQueueCapacity(80);
//允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁
executor.setKeepAliveSeconds(60);
// 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
executor.setThreadNamePrefix("taskExecutor-");
// 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
//用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
executor.setWaitForTasksToCompleteOnShutdown(true);
//该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
executor.setAwaitTerminationSeconds(60);
return executor;
}
}
构造传入参数
@AllArgsConstructor
public class AsyncSendService implements Runnable{
private SendMailServiceImpl sendMailService;
private String reportNo;
private Date currentDate;
@Override
public void run() {
sendMailService.sendMailAndMsg(reportNo, currentDate);
}
}
调用
@Resource(name = "taskExecutor")
ThreadPoolTaskExecutor taskExecutor;
@Autowired
SendMailServiceImpl sendMailService;
String rgtNo="xxxxx"
Date currentDate = 20xx-02-10;
AsyncSendService asyncSendService = new AsyncSendService(sendMailService,claimConfirmationVO.getRgtNo(),currentDate);
taskExecutor.execute(asyncSendService);