SpringBoot使用 Async非同步呼叫

2021-10-01 01:47:14 字數 1933 閱讀 8054

什麼是「非同步呼叫」?

「非同步呼叫」對應的是「同步呼叫」,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。

下面通過乙個簡單示例來直觀的理解什麼是同步呼叫:

定義task類,建立三個處理函式分別模擬三個執行任務的操作,操作消耗時間分別為5000,3000,1000 ms

/**

* @author azhu

* @date 2019/7/16 10:30

*/@component

public class task

public void dotasktwo() throws exception

public void dotaskthree() throws exception

}

在單元測試用例中,注入task物件,並在測試用例中執行dotaskone、dotasktwo、dotaskthree三個函式並計算總時間

@runwith(springrunner.class)

@springboottest

@autowired

private task task;

@test

public void test() throws exception

}

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

上述的同步呼叫雖然順利的執行完了三個任務,但是可以看到執行時間比較長,若這三個任務本身之間不存在依賴關係,可以併發執行的話,同步呼叫在執行效率方面就比較差,可以考慮通過非同步呼叫的方式來併發執行。

在spring boot中,我們只需要通過使用@async註解就能簡單的將原來的同步函式變為非同步函式,task類改在為如下模式:

/**

* @author azhu

* @date 2019/7/16 11:00

*/@component

public class asynctask

@async

public futuredotasktwo() throws exception

@async

public futuredotaskthree() throws exception

}

注: @async所修飾的函式不要定義為static型別,這樣非同步呼叫不會生效

為了讓dotaskone、dotasktwo、dotaskthree能正常結束,假設我們需要統計一下三個任務併發執行共耗時多少,這就需要等到上述三個函式都完成調動之後記錄時間,並計算結果。

那麼我們如何判斷上述三個非同步呼叫是否已經執行完成呢?我們需要使用future來返回非同步呼叫的結果

/**

* @author azhu

* @date 2019/7/16 11:02

*/@runwith(springrunner.class)

@springboottest

@autowired

private asynctask task;

@test

public void test() throws exception

long end =system.currenttimemillis();

system.out.println("任務全部完成,總耗時:" + (end - start) + "毫秒");}}

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

SpringBoot使用thymeleaf模板

springboot開發的web專案contrller如何跳轉到前端頁面 據說,最流行的還是freemarker和velocity這兩種模板,我們這裡用spring官方推薦的thymeleaf模板 在建立好springboot專案的基礎上,進行如下配置 在pom中到thymeleaf的依賴 org....

Spring Boot使用Undertow做伺服器

1 建立spring boot專案,修改其pom.xml檔案 org.springframework.boot spring boot starter test org.springframework.boot spring boot starter web org.springframework....

SpringBoot快取使用

org.springframework.boot spring boot starter cache 專案使用springboot自帶的快取機制實現快取 redis快取 redis是一款記憶體快取記憶體資料庫 membase快取 memcache是乙個自由和開放源 高效能 分配的記憶體物件快取系統。...