什么是”異步調用”與”同步調用”
“同步調用”就是程序按照一定的順序依次執行,,每一行程序代碼必須等上一行代碼執行完畢才能執行;”異步調用”則是只要上一行代碼執行,無需等待結果的返回就開始執行本身任務。
通常情況下,”同步調用”執行程序所花費的時間比較多,執行效率比較差。所以,在代碼本身不存在依賴關系的話,我們可以考慮通過”異步調用”的方式來并發執行。
“異步調用”
在 spring boot 框架中,只要提過@Async注解就能獎普通的同步任務改為異步調用任務。
注意: @Async所修飾的函數不要定義為static類型,這樣異步調用不會生效
1. 開啟@Async注解
在Spring Boot主類添加@EnableAsync注解
2. 定義異步任務
定義Task類,創建三個處理函數分別模擬三個執行任務的操作,操作消耗時間隨機取(10秒內)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@Component public class Task { //定義一個隨機對象. public static Random random = new Random(); @Async //加入"異步調用"注解 public void doTaskOne() throws InterruptedException { System.out.println( "開始執行任務一" ); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt( 10000 )); long end = System.currentTimeMillis(); System.out.println( "完成任務一,耗時:" + (end - start) + "毫秒" ); } @Async public void doTaskTwo() throws InterruptedException { System.out.println( "開始執行任務二" ); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt( 10000 )); long end = System.currentTimeMillis(); System.out.println( "完成任務二,耗時:" + (end - start) + "毫秒" ); } @Async public void doTaaskThree() throws InterruptedException { System.out.println( "開始執行任務三" ); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt( 10000 )); long end = System.currentTimeMillis(); System.out.println( "完成任務三,耗時:" + (end - start) + "毫秒" ); } } |
3. 創建Controller進行測試
注意@Autowired注入類,因為這個類已經被 Spring 管理了。如果使用 new 來獲得線程類將不會執行異步效果,這里涉及到在 Spring 中使用多線程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Controller public class TaskController { @Autowired private Task TASK; @ResponseBody @RequestMapping ( "/task" ) public String task() throws Exception { System.out.println( "開始執行Controller任務" ); long start = System.currentTimeMillis(); TASK.doTaskOne(); TASK.doTaskTwo(); TASK.doTaaskThree(); long end = System.currentTimeMillis(); System.out.println( "完成Controller任務,耗時:" + (end - start) + "毫秒" ); return "success" ; } } |
4. 多次調用
訪問 http://localhost:8080/task 截圖:
項目參考地址: https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B7
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/u011244202/article/details/54864528