Spring Boot 配置和使用多線程池的實(shí)現(xiàn)
某些情況下,我們需要在項(xiàng)目中對(duì)多種任務(wù)分配不同的線程池進(jìn)行執(zhí)行。從而通過監(jiān)控不同的線程池來控制不同的任務(wù)。為了達(dá)到這個(gè)目的,需要在項(xiàng)目中配置多線程池。
spring boot 提供了簡(jiǎn)單高效的線程池配置和使用方案。
配置
首先是配置線程池的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");
//當(dāng)任務(wù)數(shù)量超過MaxPoolSize和QueueCapacity時(shí)使用的策略,該策略是又調(diào)用任務(wù)的線程執(zhí)行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
使用
使用線程只需要在執(zhí)行方法上加上注釋,同時(shí)該方法的類必須被定義為bean,交由spring管理。
可以在類上使用注解@Component、@Service等
@Async(value="ThreadPoolA")
public void taskA(){
...
}
查看線程活躍數(shù):
@Autowired
private ThreadPoolTaskExecutor threadPoolA;//變量名稱為定義的線程池bean定義的name屬性名。
public void checkAvtiveThreadNum() {
int num = threadPoolA.getActiveCount();
}
當(dāng)然還有其他一些方法,這里不再舉例。
線程池各屬性理解:
corePoolSize:表示線程池核心線程,正常情況下開啟的線程數(shù)量。
queueCapacity:當(dāng)核心線程都在跑任務(wù),還有多余的任務(wù)會(huì)存到此處。
maxPoolSize:如果queueCapacity存滿了,還有任務(wù)就會(huì)啟動(dòng)更多的線程,直到線程數(shù)達(dá)到maxPoolSize。如果還有任務(wù),則根據(jù)拒絕策略進(jìn)行處理。
拒絕策略有多種:
- 由任務(wù)調(diào)用線程執(zhí)行
- 拋異常
- 多余的直接拋棄
- 根據(jù)FIFO(先進(jìn)先出)拋棄隊(duì)列里任務(wù)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java Calendar類的使用總結(jié)實(shí)例
這篇文章主要介紹了Java Calendar類的使用總結(jié)實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Spring使用@Filter注解創(chuàng)建自定義過濾器
Spring 中鮮為人知但非常有用的注解之一是 @Filter,它支持自定義過濾器,下面我們就來深入研究一下如何使用 Spring 的 @Filter 注解來創(chuàng)建自定義過濾器吧2023-11-11
java通過RESTful API實(shí)現(xiàn)兩個(gè)項(xiàng)目之間相互傳輸數(shù)據(jù)
一些特殊場(chǎng)景中,兩個(gè)項(xiàng)目發(fā)布在不同的服務(wù)器,并且由于服務(wù)器限制特殊情況ip無法相通時(shí)進(jìn)行開放接口方式進(jìn)行數(shù)據(jù)傳輸,下面我們就來看看java通過RESTful API實(shí)現(xiàn)這一需求吧2025-09-09
springboot集成JWT實(shí)現(xiàn)身份認(rèn)證(權(quán)鑒)的方法步驟
本文主要介紹了springboot集成JWT實(shí)現(xiàn)身份認(rèn)證(權(quán)鑒)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Java輕松掌握面向?qū)ο蟮娜筇匦苑庋b與繼承和多態(tài)
本文主要講述的是面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài),內(nèi)容含括從封裝到繼承再到多態(tài)的所有重點(diǎn)內(nèi)容以及使用細(xì)節(jié)和注意事項(xiàng),內(nèi)容有點(diǎn)長(zhǎng),請(qǐng)大家耐心看完2022-05-05
Java volatile如何實(shí)現(xiàn)禁止指令重排
這篇文章主要介紹了Java volatile如何實(shí)現(xiàn)禁止指令重排,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
SpringBoot中@Scheduled()注解以及cron表達(dá)式詳解
這篇文章主要介紹了SpringBoot中@Scheduled()注解以及cron表達(dá)式詳解,@Scheduled注解是Spring Boot提供的用于定時(shí)任務(wù)控制的注解,主要用于控制任務(wù)在某個(gè)指定時(shí)間執(zhí)行,或者每隔一段時(shí)間執(zhí)行,需要的朋友可以參考下2023-08-08

