導航:首頁 > 方法技巧 > 如何單元測試線程的run方法

如何單元測試線程的run方法

發布時間:2025-05-28 20:35:39

A. SpringBoot之@Async非同步調用

利用 Spring Initializer 創建一個 gradle 項目 spring-boot-async-task,創建時添加相關依賴。
在 Spring Boot 入口類上配置 @EnableAsync 註解開啟非同步處理。

創建任務抽象類 AbstractTask,並分別配置三個任務方法 doTaskOne(),doTaskTwo(),doTaskThree()。

下面通過一個簡單示例來直觀的理解什麼是同步調用:
定義 Task 類,繼承 AbstractTask,三個處理函數分別模擬三個執行任務的操作,操作消耗時間隨機取(10 秒內)。

在 單元測試 用例中,注入 Task 對象,並在測試用例中執行 doTaskOne(),doTaskTwo(),doTaskThree() 三個方法。

執行單元測試,可以看到類似如下輸出:

任務一、任務二、任務三順序的執行完了,換言之 doTaskOne(),doTaskTwo(),doTaskThree() 三個方法順序的執行完成。

上述的棚消可以看到 執行時間比較長,若這三個任務本身之間 不存在依賴關系,可以 並發執行 的話,同步調用在 執行效率 方面就比較差,可以考慮通過 非同步調用 的方式來 並發執行。

創建 AsyncTask類,分別在方法上配置 @Async 註解,將原來的 同步方法 變為 非同步方法。

在 單元測試 用例中,注入 AsyncTask 對象,並在測試用例中執行 doTaskOne(),doTaskTwo(),doTaskThree() 三個方法。

執行單元測試,可以看到類似如下輸出:

如果反復執行襪老單元測試,可能會遇到各種不同的結果,比如:

原因是目前 doTaskOne(),doTaskTwo(),doTaskThree() 這三個方法已經 非同步執行 了。主程序在 非同步調用 之後,主程序並不會理會這三個函數是否執行完成告和升了,由於沒有其他需要執行的內容,所以程序就 自動結束 了,導致了 不完整 或是 沒有輸出任務 相關內容的情況。

根據業務需求,可以將暫時不需要立即獲得處理的方法設置為 @Async .

比如用戶在前端點擊完成了登錄操作,這時候根據業務要求需要在登錄成功之後進行埋點的處理.

其實埋點成功與否都不影響用戶操作,這時候就可以將埋點方法設置為@Async.

個人認為此類任務通常有三個特徵:

為了讓 doTaskOne(),doTaskTwo(),doTaskThree() 能正常結束,假設我們需要統計一下三個任務 並發執行 共耗時多少,這就需要等到上述三個函數都完成動用之後記錄時間,並計算結果。

那麼我們如何判斷上述三個 非同步調用 是否已經執行完成呢?我們需要使用 Future<T> 來返回 非同步調用 的 結果。

在 單元測試 用例中,注入 AsyncCallBackTask 對象,並在測試用例中執行 doTaskOneCallback(),doTaskTwoCallback(),doTaskThreeCallback() 三個方法。循環調用 Future 的 isDone() 方法等待三個 並發任務 執行完成,記錄最終執行時間。

在測試用例一開始記錄開始時間;在調用三個非同步函數的時候,返回Future類型的結果對象;在調用完三個非同步函數之後,開啟一個循環,根據返回的Future對象來判斷三個非同步函數是否都結束了。若都結束,就結束循環;若沒有都結束,就等1秒後再判斷。跳出循環之後,根據結束時間 - 開始時間,計算出三個任務並發執行的總耗時。

執行一下上述的單元測試,可以看到如下結果:

可以看到,通過 非同步調用,讓任務一、任務二、任務三 並發執行,有效的 減少 了程序的 運行總時間。

在上述操作中,創建一個 線程池配置類 TaskConfiguration ,並配置一個 任務線程池對象 taskExecutor。

上面我們通過使用 ThreadPoolTaskExecutor 創建了一個 線程池,同時設置了以下這些參數:

創建 AsyncExecutorTask類,三個任務的配置和 AsyncTask 一樣,不同的是 @Async 註解需要指定前面配置的 線程池的名稱 taskExecutor。

在 單元測試 用例中,注入 AsyncExecutorTask 對象,並在測試用例中執行 doTaskOne(),doTaskTwo(),doTaskThree() 三個方法。

執行一下上述的 單元測試,可以看到如下結果:

執行上面的單元測試,觀察到 任務線程池 的 線程池名的前綴 被列印,說明 線程池 成功執行 非同步任務!

解決方案如下,重新設置線程池配置對象,新增線程池 () 和 setAwaitTerminationSeconds() 配置:

閱讀全文

與如何單元測試線程的run方法相關的資料

熱點內容
供求分析方法 瀏覽:2
微信麥克風功能在哪裡設置方法 瀏覽:910
如何把發際線拉低的健康方法 瀏覽:421
怎麼去紅棗核最快方法 瀏覽:913
兒童帶滑輪學習桌安裝方法 瀏覽:320
理財利息計算方法 瀏覽:66
現場審核常用方法 瀏覽:333
外科學治療方法 瀏覽:788
合歡樹的種植方法 瀏覽:846
情感保鮮方法有哪些 瀏覽:70
波紋管管件安裝方法 瀏覽:679
紅果參蜘蛛果的食用方法 瀏覽:121
農業區位教學方法 瀏覽:36
土豆絲怎麼做才好吃的方法 瀏覽:600
直線與圓的一些簡便方法 瀏覽:69
耍酒瘋最簡單的方法 瀏覽:213
財務分析法的主要分析方法 瀏覽:244
whoo眼膜使用方法圖片 瀏覽:863
保時龍使用方法 瀏覽:869
化學按鍵測量方法 瀏覽:368