導航:首頁 > 方法技巧 > 如何單元測試線程的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方法相關的資料

熱點內容
食用水的使用方法 瀏覽:902
小兒腸氣治療方法 瀏覽:760
口臭方法解決 瀏覽:320
水管快接使用方法 瀏覽:783
試紙查看方法圖片 瀏覽:843
模擬使用方法 瀏覽:86
工程測量有哪些測量方法 瀏覽:952
電爐絲安裝方法 瀏覽:414
中度肺心病治療方法 瀏覽:649
麵粉做餅的簡單方法 瀏覽:897
震樓神器安裝方法視頻 瀏覽:760
配菜的方法如何理解運用 瀏覽:187
苦參洗液使用方法 瀏覽:502
證明數列收斂的方法如何找極限 瀏覽:704
50內加法怎麼算簡單方法 瀏覽:869
靈芝用營養液種植方法 瀏覽:397
常用投資偏差的分析方法 瀏覽:264
如何安裝電鑽的方法視頻 瀏覽:239
怎麼系鞋帶方法視頻 瀏覽:74
烯鑒別方法 瀏覽:97