什麼是異步調用?html
異步調用是相對於同步調用而言的,同步調用是指程序按預約順序一步步執行,每一步必須等到上一步執行完後才能執行,異步調用則無需等待上一步程序執行完便可執行。java
如何實現異步調用?web
多線程,這是不少人第一眼想到的關鍵詞,沒錯,多線程就是一種實現異步調用的方式。spring
在非spring目項目中咱們要實現異步調用的就是使用多線程方式,能夠本身實現Runable接口或者集成Thread類,或者使用jdk1.5以上提供了的Executors線程池。瀏覽器
StrngBoot中則提供了很方便的方式執行異步調用。多線程
按照官方示例開擼app
代碼入下異步
maven依賴:async
啓動類:添加@EnableAsync註解
Controller maven
只需在須要異步執行方法上添加@Async註解
main函數運行spirngboot項目,啓動完成後瀏覽器訪問:
http://localhost:8080/
控制檯:
等了一段瀏覽器時候輸出入下:
異步並無執行!
難道是代碼寫錯了?反覆檢查了好幾遍,並無發現什麼明顯錯誤,想起spring對@Transactional註解時也有相似問題,spring掃描時具備@Transactional註解方法的類時,是生成一個代理類,由代理類去開啓關閉事務,而在同一個類中,方法調用是在類體內執行的,spring沒法截獲這個方法調用。
豁然開朗,將異步任務單獨放到一個類中,調整代碼入下:
Controller
異步任務類
控制檯:
異步調用成功!
如何知道三個異步任務何時執行完,執行的結果怎樣呢?能夠採用添加Fature回調方式判斷
代碼入下:
異步任務類
控制檯輸出:
瀏覽器輸出:
異步調用成功,而且在全部任務都完成時程序才返回告終果!