spring異步任務@Async 結合線程池使用的源碼理解

最近在做重構,業務實現需要用到異步操作。隨即在網上看了些關於spring異步操作的文章,最後決定用異步註解@Async結合線程池的方式來實現。
關於異步註解的使用以及注意事項在此不再詳述,具體可參考:
1. spring @Async異步方法使用及原理說明
2. Spring異步任務@Async註解源碼解析

首先自定義一個配置類:
線程池配置類

在@Async註解中添加線程池名稱異步註解注入線程池

我們在調用該方法的時候,就默認使用我們自定義的線程池,開啓異步操作了。

那麼問題來了,爲什麼這樣配置就使用我們自定義的線程池了呢?讓我們繼續往下看。
在AsyncExecutionInterceptor 類下的 invoke方法中。有一個獲取線程池的方法: determineAsyncExecutor(userDeclaredMethod)。 這個方法就是獲取我們自定義線程池的關鍵圖一,異步註解自定義線程池

繼續往下看:
獲取線程池

當執行到1處的時候,executors初始化之後是一個長度爲0的Map。所以第一次取值爲null。這時繼續往下執行到2處:當我們配置了線程池,且在@Async注入了線程池,我們纔會拿到自定義的線程池。

如果沒有配置或者沒有注入自定義的線程池,那麼繼續往下執行3:從beanFactory找一個線程池(如果有自定義配置的線程池,會從自定義的線程池中找到一個優先級高的返回。如果有多個,且優先級都一樣,則會拋出異常"Could not find unique TaskExecutor bean",最終會創建一個默認的線程池)返回。

拿到線程池之後,執行到4,將該線程池與對應的method添加到executors中。當再有請求過來時,會去executors找是否存在該mothod的線程池,如果存在則直接拿出來使用,不存在則重複之前的操作。

以上就是我對spring異步任務@Async 結合線程池使用理解,如果有錯誤的地方,還望指正,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章