當前位置:
首頁 > 知識 > 使用Spring的Async創建非同步方法

使用Spring的Async創建非同步方法

在開發系統的過程中,通常會考慮到系統的性能問題,提升系統性能的一個重要思想就是「串列」改「並行」。說起「並行」自然離不開「非同步」,今天我們就來聊聊如何使用Spring的@Async的非同步註解。

假設場景

你有一個很耗時的服務,我們在下面的例子中用線程休眠來模擬,服務執行需要5秒鐘。假設一個請求需要調用這個服務3次,如果按照「串列」的方法,將至少需要15秒鐘。那麼為了提升系統的性能,我們採用「並行」的方法,我們最樂觀的情況下,只需要5秒就可以了。有人可能會說這個很簡單,我們寫個多線程的方法就可以了。但是,今天我們看看Spring為我們提供的方法,它使得開發的過程更簡單。

創建非同步方法

首先,使用IDEA工具創建Spring-Boot項目,並且選擇依賴包Lombok,具體步驟略。然後創建BusyService類,並創建busyMethod方法,具體如下:

其中,BusyService上的註解@Service標識著它會被Spring初始化為一個實例,而@Slf4j則標識著我們可以直接使用log列印日誌。然後我們再看看busyMethod方法,它的返回值是CompletableFuture,CompletableFuture繼承自Future,它可以把多個非同步執行的結果合併到一個單獨的非同步結果中,CompletableFuture是任何非同步服務所需要的。我們再看看busyMethod方法上的註解@Async,這個註解是我們今天的主角,它標識著這個方法是非同步方法,調用它時是非同步調用的。再看看方法體中的內容,我們使用了線程休眠模擬那些耗時的服務,並返回CompletableFuture。

Executor線程池

我們在系統定義一個Executor的Bean,使得非同步調用時,使用Executor線程池的線程去執行。這裡為了方便,我們直接在Spring-Boot的啟動類中增加這個Bean。

我們定義了最大的並發線程數為3,並且定義了隊列中的最大任務數為500,線程名字的前綴為「Java同學會」,在log列印日誌時,凡是線程池中的線程執行的,都會列印出「Java同學會」的線程名字。當然你還可以增加一些其他的設置。如果你不配置Executor這個Bean,Spring會自動創建SimpleAsyncTaskExecutor,並使用它來執行非同步方法。

Controller

我們使用一個簡單的RestController完成非同步的調用,如下所示:

我們在啟動類上加上@EnableAsync註解,使得Spring-Boot可以使用非同步調用。再看看test()方法,我們調用了3次非同步方法,並等待它們全部完成後,將它們列印出來。我們啟動項目,並在瀏覽器中訪問這個方法,地址是:http://localhost:8080/test。

我們在等待了5秒後,頁面上返回了「success」。我們再看看後台列印的結果:

我們看到名字前綴為「Java同學會」前綴的3個線程,列印了busyMethod方法中的日誌。因為busyMethod方法是我們定義的Executor線程池中的線程執行的。我們再看看test方法和busyMethod方法中日誌列印的時間,它們相隔了5秒,說明test方法中的CompletableFuture.allOf(jane,allen,james).join()一直在等待,等待所有調用的非同步方法都執行完,才繼續執行。

好了,Spring的@Async就介紹完了,是不是很方便呢?有問題評論區留言哦~~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

Pipenv:Python包管理神器
充分理解跨域問題並解決跨域問題

TAG:千鋒JAVA開發學院 |