SpringBoot 整合线程池

分为三步

  1. 启动类加 @EnableAsync 注解
  2. 在方法上加 @Async 注解
  3. 创建线程池配置类

1.启动类加 @EnableAsync 注解

@SpringBootApplication @EnableAsync public class FacadeH5Application {     public static void main(String[] args) {         SpringApplication.run(FacadeH5Application.class, args);     } } 

2.在方法上加 @Async 注解

@Async public void m1() {     //do something } 

注意:导致 @Async 注解失效的几个原因

  1. 两个方法都在同一个类里面,一个方法调用另一个异步方法,不生效。但是如果在本类中注入自己的实例,再通过自己的实例调用异步方法就可行。
  2. @Async 方法所在的类没有交给 spring 代理(没加诸如@Component注解),不生效。
  3. 注解的方法不是是public方法,不生效。

3.创建线程池配置类

默认的线程池配置如下

# 核心线程数 spring.task.execution.pool.core-size=8   # 最大线程数 spring.task.execution.pool.max-size=16 # 空闲线程存活时间 spring.task.execution.pool.keep-alive=60s # 是否允许核心线程超时 spring.task.execution.pool.allow-core-thread-timeout=true # 线程队列数量 spring.task.execution.pool.queue-capacity=100 # 线程关闭等待 spring.task.execution.shutdown.await-termination=false spring.task.execution.shutdown.await-termination-period= # 线程名称前缀 spring.task.execution.thread-name-prefix=task- 

创建线程池配置类

@Configuration public class ThreadPoolConfig {     @Bean     public TaskExecutor taskExecutor(){         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();         //设置核心线程数         executor.setCorePoolSize(10);         //设置最大线程数         executor.setMaxPoolSize(20);         //设置队列容量         executor.setQueueCapacity(20);         //设置线程活跃时间         executor.setKeepAliveSeconds(30);         //设置线程名称前缀         executor.setThreadNamePrefix("sendSms-");         //设置拒绝策略         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());         //等待所有任务结束后再关闭线程池         executor.setWaitForTasksToCompleteOnShutdown(true);         //设置线程池中任务的等待时间         executor.setAwaitTerminationSeconds(60);          return executor;     } } 

配置多个线程池

有时候,一个项目中如果配置了多个线程池,那需要在 @Bean后面加上线程池的名称

@Configuration public class ThreadPoolConfig {     @Bean("ThreadPool1")     public TaskExecutor taskExecutor(){         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 		......         return executor;     }     @Bean("ThreadPool2")     public TaskExecutor taskExecutor(){         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 		......         return executor;     } } 

在使用 @Async注解时就需要指明具体使用的线程池,如下格式

@Async("ThreadPool1") public void m1() {     //do something } 

发表评论

评论已关闭。

相关文章