SpringBoot提供了异步线程池,废话不多说,直接上代码
代码如下:
/**
* @author songwei
* <p>
* 异步线程池
* </p>
*/
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
protected Logger logger = LoggerFactory.getLogger(getClass());
/**
* <p>核心线程数</p>
*/
@Value("&{asyncConfig.setCorePoolSize}")
private Integer setCorePoolSize;
/**
* <p>最大线程数</p>
*/
@Value("&{asyncConfig.setMaxPoolSize}")
private Integer setMaxPoolSize;
/**
* <p>缓冲队列</p>
*/
@Value("&{asyncConfig.setQueueCapacity}")
private Integer setQueueCapacity;
/**
* <p>允许线程的空闲时间</p>
*/
@Value("&{asyncConfig.setKeepAliveSeconds}")
private Integer setKeepAliveSeconds;
/**
* <p>线程池名的前缀</p>
*/
@Value("&{asyncConfig.setThreadNamePrefix}")
private String setThreadNamePrefix;
/**
* <p>切记!切记!切记,这个地方是一个坑,也是个关键方法。设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean</p>
*/
@Value("&{asyncConfig.setWaitForTasksToCompleteOnShutdown}")
private boolean setWaitForTasksToCompleteOnShutdown;
/**
* <p>设置线程池中任务的等待时间</p>
*/
@Value("&{asyncConfig.setAwaitTerminationSeconds}")
private Integer setAwaitTerminationSeconds;
/**
* @author songwei
* <p>该方法是异步线程池,自动创建线程,设置线程数量,销毁时间等</p>
* <p>setCorePoolSize:线程池创建时候初始化的线程数</p>
* <p>setMaxPoolSize:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程</p>
* <p>setQueueCapacity:用来缓冲执行任务的队列</p>
* <p>setKeepAliveSeconds:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁</p>
* <p>setThreadNamePrefix:设置好了之后可以方便我们定位处理任务所在的线程池</p>
* <p>setWaitForTasksToCompleteOnShutdown:用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean,这样这些异步任务的销毁就会先于Redis线程池的销毁。</p>
* <p>setAwaitTerminationSeconds:该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。</p>
* @return
*/
@Bean("getAsyncExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(setCorePoolSize);
executor.setMaxPoolSize(setMaxPoolSize);
executor.setQueueCapacity(setQueueCapacity);
executor.setKeepAliveSeconds(setKeepAliveSeconds);
executor.setThreadNamePrefix(setThreadNamePrefix);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(setWaitForTasksToCompleteOnShutdown);
executor.setAwaitTerminationSeconds(setAwaitTerminationSeconds);
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
//TDD
return null;
}
}
下面是YML文件的配置
#SEname:songwei
#Time:2020-03-23 11:01:39
#AsyncName: 异步线程池线程池
asyncConfig:
setCorePoolSize: 10 #核心线程数&{setCorePoolSize}线程池创建时候初始化的线程数
setMaxPoolSize: 20 #最大线程数&{setMaxPoolSize}:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
setQueueCapacity: 200 #缓冲队列&{setQueueCapacity}:用来缓冲执行任务的队列
setKeepAliveSeconds: 60 #允许线程的空闲时间&{setKeepAliveSeconds},单位为秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
setThreadNamePrefix: taskExecutor- #线程池名的&{setThreadNamePrefix}:设置好了之后可以方便我们定位处理任务所在的线程池
setWaitForTasksToCompleteOnShutdown: true #切记!切记!切记!这是关键方法,用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean,这样这些异步任务的销毁就会先于Redis线程池的销毁。
setAwaitTerminationSeconds: 60 #该方法用来设置线程池中任务的等待&{setAwaitTerminationSeconds},如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。