SpringBoot 整合執行緒池

救苦救难韩天尊發表於2024-08-14

分為三步

  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
}

相關文章