SpringBoot異步調用@Async

SpringBoot異步調用@Async

一. 什麼是異步調用?

異步調用是相對於同步調用而言的,同步調用是指程序按預定順序一步步執行,每一步必須等到上一步執行完後才能執行,異步調用則無需等待上一步程序執行完即可執行。

二. 如何實現異步調用?

多線程,這是很多人第一眼想到的關鍵詞,沒錯,多線程就是一種實現異步調用的方式。在非spring目項目中我們要實現異步調用的就是使用多線程方式,可以自己實現Runable接口或者集成Thread類,或者使用jdk1.5以上提供了的Executors線程池。在spring 3.x之後,就已經內置了@Async來完美解決這個問題,下面將介紹在springboot中如何使用@Async。

三. 舉例說明(無須知道執行結果):

1、pom.xml中導入必要的依賴:

SpringBoot異步調用@Async

2、寫一個springboot的啟動類:

啟動類裡面使用@EnableAsync註解開啟功能,自動掃描

SpringBoot異步調用@Async

3、建一個service包,然後新建一個UserService類:

要在異步任務的類上寫@Component在定義異步任務類寫@Async(寫在類上代表整個類都是異步,在方法加上代表該類異步執行)

SpringBoot異步調用@Async

4、建一個controller包,然後新建一個IndexController類,用來獲取請求:

SpringBoot異步調用@Async

先注掉@EnableAsync和@Async兩個註解,看下同步調用執行的效果。執行結果如下:

####IndexController#### 1
####sendSms#### 2
####sendSms#### 3
####IndexController#### 4

對於sendSms方法,我們並不關注它什麼時候執行完,所以可以採用異步的方式去執行。放開@EnableAsync和@Async兩個註解,執行結果如下:

####IndexController#### 1
####IndexController#### 4
####sendSms#### 2
####sendSms#### 3

總結:使用了@Async的方法,會被當成是一個子線程,所有整個sendSms方法,會在主線程執行完了之後執行

四. 舉例說明(須知道執行結果):

基於上面例子,這裡只貼核心代碼

1、啟動類

SpringBoot異步調用@Async

2、異步類

SpringBoot異步調用@Async

3、controller類

SpringBoot異步調用@Async

執行結果如下:

任務6耗時=1000
任務4耗時=2000
任務5耗時=3000
執行總耗時=3012

總結:
從上面示例我們可以看出:如果同步方法,那我們需要6秒,而異步執行,我們只需要3秒左右,這就是異步的作用。
1)要把異步任務封裝到類裡面,不能直接寫到Controller
2)增加Future<string> 返回結果 AsyncResult<string>("task執行完成");
3)如果需要拿到結果 需要判斷全部的 task.isDone()/<string>/<string>


分享到:


相關文章: