springboot默認線程池簡單實現
1.使用方法在spring boot的啟動類上加上@EnableAsync注解,表示項目支持異步方法調用
2.在需要異步調用的方法上添加@Async注解,表示該方法為異步方法,即該方法和調用者不在一個線程中進行如果需要返回值
1、判斷核心線程池是否已滿,如果不是,則創建線程執行任務
2、如果核心線程池滿了,判斷隊列是否滿了,如果隊列沒滿,將任務放在隊列中
3、如果隊列滿了,則判斷線程池是否已滿,如果沒滿,創建線程執行任務
4、如果線程池也滿了,則按照拒絕策略對任務進行處理
對於spring框架中線程池配置參數的涵義,可以參考ThreadPoolExecutor對象中的解釋。
說明:對於@Async注解默認會基於ThreadPoolTaskExecutor對象獲取工作線程,然后調用由@Async描述的方法,讓方法運行於一個工作線程,以實現異步操作。但是假如系統中的默認拒絕處理策略,任務執行過程的異常處理不能滿足我們自身業務需求的話,我可以對異步線程池進行自定義.(SpringBoot中默認的異步配置可以參考自動配置對象TaskExecutionAutoConfiguration).
簡單配置
或者通過自定義配置類的方式實現
1、 核心參數介紹
1、CorePoolSize:核心線程數,核心線程會一直存活,即使沒有任務
2、MaxPoolSize:線程池中的最大線程數
3、QueueCapacity:阻塞隊列的容量,用來存儲等待執行的任務
4、KeepAliveSeconds:線程空閑時間
5、RejectedExecutionHandler:拒絕策略
2、為了讓Spring中的異步池更好的服務於我們的業務,同時也盡量避免OOM,可以自定義線程池優化設計如下:關鍵代碼如下:
@Slf4j
@Setter
@Configuration
@ConfigurationProperties("async-thread-pool")
public class SpringAsyncConfig implements AsyncConfigurer{
/**核心線程數*/
private int corePoolSize=20;
/**最大線程數*/
private int maximumPoolSize=1000;
/**線程空閑時間*/
private int keepAliveTime=30;
/**阻塞隊列容量*/
private int queueCapacity=200;
/**構建線程工廠*/
private ThreadFactory threadFactory=new ThreadFactory() {
//CAS算法
private AtomicInteger at=new AtomicInteger(1000);
@Override
public Thread newThread(Runnable r) {
return new Thread(r,
"async-thread-"+at.getAndIncrement());
}
};
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maximumPoolSize);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setQueueCapacity(queueCapacity);
executor.setRejectedExecutionHandler((Runnable r,
ThreadPoolExecutor exe) -> {
log.warn("當前任務線程池隊列已滿.");
});
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler
getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable ex ,
Method method , Object... params) {
log.error("線程池執行任務發生未知異常.", ex);
}
};
}}
其中:@ConfigurationProperties("async-thread-pool")的含義是讀取application.yml配置文件中以"async-thread-pool"名為前綴的配置信息,並通過所描述類的set方法賦值給對應的屬性,在application.yml中連接器池的關鍵配置如下:
async-thread-pool:
corePoolSize: 20
maxPoolSize: 1000
keepAliveSeconds: 30
queueCapacity: 1000
后續在業務類中,假如我們使用@Async注解描述業務方法,默認會使用ThreadPoolTaskExecutor池對象中的線程執行異步任務