「異步調用」對應的是「同步調用」,同步調用指程序按照定義順序依次執行,每一行程序都必須等待上一行程序執行完成以後才能執行;異步調用指程序在順序執行時,不等待異步調用的語句返回結果就執行後面的程序。併發
先測試一下同步調用:異步
書寫同步調用測試用例:函數
運行後輸出:單元測試
開始作任務一
完成任務一,耗時:9723毫秒
開始作任務二
完成任務二,耗時:3498毫秒
開始作任務三
完成任務三,耗時:7015毫秒測試
上述的同步調用雖然順利的執行完了三個任務,可是能夠看到執行時間比較長,
若這三個任務自己之間不存在依賴關係,能夠併發執行的話,同步調用在執行效率方面就比較差,
能夠考慮經過異步調用的方式來併發執行。code
Spring Boot中,咱們只須要經過使用@Async註解就能簡單的將原來的同步函數變爲異步函數。對象
注:爲了讓@Async註解可以生效,還須要在Spring Boot的主程序中配置@EnableAsync,
* @Async所修飾的函數不要定義爲static類型,這樣異步調用不會生效blog
此時能夠反覆執行單元測試,您可能會遇到各類不一樣的結果,好比:同步
緣由是目前doTaskOne
、doTaskTwo
、doTaskThree
三個函數的時候已是異步執行了。主程序在異步調用以後,主程序並不會理會這三個函數是否執行完成了,因爲沒有其餘須要執行的內容,因此程序就自動結束了,致使了不完整或是沒有輸出任務相關內容的狀況。效率
爲了讓doTaskOne
、doTaskTwo
、doTaskThree
能正常結束,假設咱們須要統計一下三個任務併發執行共耗時多少,這就須要等到上述三個函數都完成調動以後記錄時間,並計算結果。
測試用例的書寫
Future<String>
類型的結果對象Future<String>
對象來判斷三個異步函數是否都結束了。若都結束,就結束循環;若沒有都結束,就等1秒後再判斷。執行一下上述的單元測試,能夠看到以下結果:
能夠看到,經過異步調用,讓任務1、2、三併發執行,有效的減小了程序的總運行時間。
------參考出自程序猿DD