SpringBoot自定义线程池
使用SpringBoot构建应用时,如何使用线程处理异步任务?其实springBoot已经提供了默认的实现,通过在启动类上加上注解@EnableAsync, 然后在需要异步处理的方法上增加注解@Async即可启动一个线程进行异步处理。其实质类似于:new Thread(()-{System.out.print("处理异步任务")}).start()。但需要注意的是@Async
1.2 线程池配置属性类MyThreadPoolConfig .java
/** * 线程池配置属性类 */ @ConfigurationProperties(prefix = "mytask.pool") public class MyThreadPoolConfig { private int corePoolSize; private int maxPoolSize; private int keepAliveSeconds; private int queueCapacity; }
@EnableAsync @EnableConfigurationProperties({MyThreadPoolConfig.class}) @SpringCloudApplication public class application { public static void main(String[] args) { SpringApplication.run(application.class, args); } }
/** * 创建线程池 */ @Configuration public class MyTaskExecutePool { @Autowired private MyThreadPoolConfig config; @Bean("myTaskPool") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心线程池大小 executor.setCorePoolSize(config.getCorePoolSize()); //最大线程数 executor.setMaxPoolSize(config.getMaxPoolSize()); //队列容量 executor.setQueueCapacity(config.getQueueCapacity()); //活跃时间 executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); //线程名字前缀 executor.setThreadNamePrefix("TaskExecutePool-"); // setRejectedExecutionHandler:当pool已经达到maxSize的时候,如何处理新进任务 // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 等待所有任务结束后再关闭线程池 executor.setWaitForTasksToCompleteOnShutdown(true); executor.initialize(); return executor; } }
需要注意的是这样定义的线程池在使用的时候要在@Async主键里指定名称,如:@Async("mytaskExecutor"), 否则会使用spingtBoot提供的默认线程池。
/** * 重新SpringBoot默认的线程池 */ @Configuration public class OverrideAsyncTaskExecutePool implements AsyncConfigurer{ //注入配置类 @Autowired MyThreadPoolConfig config; @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心线程池大小 executor.setCorePoolSize(config.getCorePoolSize()); //最大线程数 executor.setMaxPoolSize(config.getMaxPoolSize()); //队列容量 executor.setQueueCapacity(config.getQueueCapacity()); //活跃时间 executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); //线程名字前缀 executor.setThreadNamePrefix("MyExecutor-"); // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务 // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; }