當我們項目中的一些非核心業務運行時,影響到用戶核心業務的響應時間,導致用戶體驗下降,可以將這些非業務放到新的線程中異步執行。
二、啟動Spring中異步操作
在SpringBoot工程,可以在啟動類的上面,添加啟動異步操作的注解(@EnableAsync)描述,代碼如下:
1 @EnableAsync 2 @SpringBootApplication 3 public class Application { 4 public static void main(String[] args) { 5 SpringApplication.run(Application.class, args); 6 } 7 }
說明,當啟動類上添加了@EnableAsync注解描述時,再次運行啟動類時底層會幫我們配置一個線程池
三、業務方法上執行異步操作
假如此時某個業務方法需要執行異步操作,可以使用@Async注解對方法進行描述,例如寫日志的業務。
1 @Async 2 public void saveObject(Log entity){ 3 sysLogDao.insertObject(entity); 4 }
其中,@Async注解描述的方法,在spring中會認為這是一個異步切入點方法, 在這個切入點方法執行時,底層會通過通知方法獲取線程池中的線程,通過池中的線程調用切入點方法(底層默認池類型為ThreadPoolExecutor類型)。
四、Spring中異步線程池的配置
當springboot中默認的線程池配置,不滿足我們實際項目需求時,我們可以對線程池進行自定義的配置,關鍵配置如下:
1 spring: 2 task: 3 execution: 4 pool: 5 core-size: 8 6 max-size: 256 7 keep-alive: 60000 8 queue-capacity: 256 9 thread-name-prefix: db-service-task-
其中:
1)core-size :核心線程數,當池中線程數沒達到core-size的值時,每接收一個新的任務都會創建一個新線程,然后存儲到池。假如池中線程數已經達到core-size設置的值,再接收新的任務時,要檢測是否有空閑的核心線程,假如有,則使用空閑的核心線程執行新的任務。
2)queue-capacity:隊列容量,假如核心線程數已達到core-size設置的值,並且所有的核心線程都在忙,再來新的任務,會將任務存儲到任務隊列。
3)max-size: 最大線程數,當任務隊列已滿,核心線程也都在忙,再來新的任務則會創建新的線程,但所有線程數不能超過max-size設置的值,否則可能會出現異常(拒絕執行)
4)keep-alive:線程空閑時間,假如池中的線程數多余core-size設置的值,此時又沒有新的任務,則一旦空閑線程空閑時間超過keep-alive設置的時間值,則會被釋放。
5)thread-name-prefix:線程名的前綴,項目中設置線程名的目的主要是為了對線程進行識別,一旦出現線程問題,可以更好的定位問題。