什麼是「非同步呼叫」?
「非同步呼叫」對應的是「同步呼叫」,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。
下面通過乙個簡單示例來直觀的理解什麼是同步呼叫:
定義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是乙個自由和開放源 高效能 分配的記憶體物件快取系統。...