SpringBoot异步线程池手写代码

SpringBoot提供了异步线程池,废话不多说,直接上代码
代码如下:

/**
 * @author songwei
 * 

* 异步线程池 *

*/
@Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { protected Logger logger = LoggerFactory.getLogger(getClass()); /** *

核心线程数

*/
@Value("&{asyncConfig.setCorePoolSize}") private Integer setCorePoolSize; /** *

最大线程数

*/
@Value("&{asyncConfig.setMaxPoolSize}") private Integer setMaxPoolSize; /** *

缓冲队列

*/
@Value("&{asyncConfig.setQueueCapacity}") private Integer setQueueCapacity; /** *

允许线程的空闲时间

*/
@Value("&{asyncConfig.setKeepAliveSeconds}") private Integer setKeepAliveSeconds; /** *

线程池名的前缀

*/
@Value("&{asyncConfig.setThreadNamePrefix}") private String setThreadNamePrefix; /** *

切记!切记!切记,这个地方是一个坑,也是个关键方法。设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean

*/
@Value("&{asyncConfig.setWaitForTasksToCompleteOnShutdown}") private boolean setWaitForTasksToCompleteOnShutdown; /** *

设置线程池中任务的等待时间

*/
@Value("&{asyncConfig.setAwaitTerminationSeconds}") private Integer setAwaitTerminationSeconds; /** * @author songwei *

该方法是异步线程池,自动创建线程,设置线程数量,销毁时间等

*

setCorePoolSize:线程池创建时候初始化的线程数

*

setMaxPoolSize:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程

*

setQueueCapacity:用来缓冲执行任务的队列

*

setKeepAliveSeconds:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁

*

setThreadNamePrefix:设置好了之后可以方便我们定位处理任务所在的线程池

*

setWaitForTasksToCompleteOnShutdown:用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean,这样这些异步任务的销毁就会先于Redis线程池的销毁。

*

setAwaitTerminationSeconds:该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。

* @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},如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。

你可能感兴趣的:(Spring,Boot,Java,后端)