Spring Boot 配置和使用多線程池

某些情況下,我們需要在項目中對多種任務(wù)分配不同的線程池進行執(zhí)行。從而通過監(jiān)控不同的線程池來控制不同的任務(wù)。為了達到這個目的,需要在項目中配置多線程池。

spring boot 提供了簡單高效的線程池配置和使用方案。

配置

首先是配置線程池的bean交給spring 管理:

@Configuration

public class TaskExecutePool {

    @Bean(name ="threadPoolA")

public ThreadPoolTaskExecutormyTaskAsyncPool() {

ThreadPoolTaskExecutor executor =new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4);

        executor.setMaxPoolSize(8);

        executor.setQueueCapacity(100);

        executor.setKeepAliveSeconds(60);

        executor.setThreadNamePrefix("Pool-A");

        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        executor.initialize();

        return executor;

    }

@Bean(name ="ThreadPoolB")

public ThreadPoolTaskExecutorAsyncPoolB() {

ThreadPoolTaskExecutor executor =new ThreadPoolTaskExecutor();

        executor.setCorePoolSize(2);

        executor.setMaxPoolSize(4);

        executor.setQueueCapacity(8);

        executor.setKeepAliveSeconds(60);

        executor.setThreadNamePrefix("Pool-B");
        //當任務(wù)數(shù)量超過MaxPoolSize和QueueCapacity時使用的策略,該策略是又調(diào)用任務(wù)的線程執(zhí)行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        executor.initialize();

        return executor;

    }

}


使用

使用線程只需要在執(zhí)行方法上加上注釋,同時該方法的類必須被定義為bean,交由spring管理。
可以在類上使用注解@Component、@Service等

@Async(value="ThreadPoolA")
public void taskA(){
  ...
}

查看線程活躍數(shù):

@Autowired
    private ThreadPoolTaskExecutor threadPoolA;//變量名稱為定義的線程池bean定義的name屬性名。

public void checkAvtiveThreadNum() {
        int num = threadPoolA.getActiveCount();
}

當然還有其他一些方法,這里不再舉例。


線程池各屬性理解:

corePoolSize:表示線程池核心線程,正常情況下開啟的線程數(shù)量。

queueCapacity:當核心線程都在跑任務(wù),還有多余的任務(wù)會存到此處。

maxPoolSize:如果queueCapacity存滿了,還有任務(wù)就會啟動更多的線程,直到線程數(shù)達到maxPoolSize。如果還有任務(wù),則根據(jù)拒絕策略進行處理。

拒絕策略有多種:

  • 由任務(wù)調(diào)用線程執(zhí)行
  • 拋異常
  • 多余的直接拋棄
  • 根據(jù)FIFO(先進先出)拋棄隊列里任務(wù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容