一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - spring boot中使用@Async實現異步調用任務

spring boot中使用@Async實現異步調用任務

2020-08-19 11:32林祥纖 Java教程

本篇文章主要介紹了spring boot中使用@Async實現異步調用任務,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

什么是“異步調用”?

“異步調用”對應的是“同步調用”,同步調用指程序按照定義順序依次執行,每一行程序都必須等待上一行程序執行完成之后才能執行;異步調用指程序在順序執行時,不等待異步調用的語句返回結果就執行后面的程序。

 同步調用

下面通過一個簡單示例來直觀的理解什么是同步調用:

定義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
34
35
36
37
38
39
40
41
42
package com.kfit.task;
import java.util.Random;
import org.springframework.stereotype.Component;
 
/**
 * 定義3個任務
 * @author Angel(QQ:412887952)
 * @version v.0.1
 */
@Component
publicclass Task1 {
  //定義一個隨機對象.
  publicstatic Random random =new Random();
 
  //任務一;
  publicvoid doTaskOne() throws Exception {
    System.out.println("開始做任務一");
    longstart = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    longend = System.currentTimeMillis();
    System.out.println("完成任務一,耗時:" + (end - start) + "毫秒");
  }
 
  //任務二;
  publicvoid doTaskTwo() throws Exception {
    System.out.println("開始做任務二");
    longstart = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    longend = System.currentTimeMillis();
    System.out.println("完成任務二,耗時:" + (end - start) + "毫秒");
  }
 
  //任務3;
  publicvoid doTaskThree() throws Exception {
    System.out.println("開始做任務三");
    longstart = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    longend = System.currentTimeMillis();
    System.out.println("完成任務三,耗時:" + (end - start) + "毫秒");
  }
 
}

 編寫一個訪問方法:

?
1
2
3
4
5
6
7
8
//測試task1.
  @RequestMapping("/task1")
  public String task1() throws Exception{
    task1.doTaskOne();
    task1.doTaskTwo();
    task1.doTaskThree();
    return"task1";
  }

運行可以看到類似如下輸出:

開始做任務一

完成任務一,耗時:4156毫秒

開始做任務二

完成任務二,耗時:557毫秒

開始做任務三

完成任務三,耗時:6171毫秒

 異步調用

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

在Spring Boot中,我們只需要通過使用@Async注解就能簡單的將原來的同步函數變為異步函數,Task類改在為如下模式:

?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.kfit.task;
import java.util.Random;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
 
/**
 * 定義3個任務
 * @author Angel(QQ:412887952)
 * @version v.0.1
 */
@Component
publicclass Task2 {
  //定義一個隨機對象.
  publicstatic Random random =new Random();
 
  //任務一;
  @Async
  publicvoid doTaskOne() throws Exception {
    System.out.println("開始做任務一");
    longstart = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    longend = System.currentTimeMillis();
    System.out.println("完成任務一,耗時:" + (end - start) + "毫秒");
  }
 
  //任務二;
  @Async
  publicvoid doTaskTwo() throws Exception {
    System.out.println("開始做任務二");
    longstart = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    longend = System.currentTimeMillis();
    System.out.println("完成任務二,耗時:" + (end - start) + "毫秒");
  }
 
  //任務3;
  @Async
  publicvoid doTaskThree() throws Exception {
    System.out.println("開始做任務三");
    longstart = System.currentTimeMillis();
    Thread.sleep(random.nextInt(10000));
    longend = System.currentTimeMillis();
    System.out.println("完成任務三,耗時:" + (end - start) + "毫秒");
  }
 
}

為了讓@Async注解能夠生效,還需要在Spring Boot的主程序中配置@EnableAsync,如下所示:

?
1
2
3
4
5
6
7
@SpringBootApplication
@EnableAsync
publicclass App {
 
  //省略其它代碼…
 
}

編寫測試方法:

?
1
2
3
4
5
6
7
8
//測試task2.
  @RequestMapping("/task2")
  public String task2() throws Exception{
    task2.doTaskOne();
    task2.doTaskTwo();
    task2.doTaskThree();
    return"task2";
  }

此時可以反復執行單元測試,您可能會遇到各種不同的結果,比如:

開始做任務一

開始做任務二

開始做任務三

完成任務三,耗時:57毫秒

完成任務二,耗時:3621毫秒

完成任務一,耗時:7419毫秒

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://412887952-qq-com.iteye.com/blog/2309126

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产实拍会所女技师在线 | 国产在线精品亚洲第一区香蕉 | 精品久久香蕉国产线看观看麻豆 | 亚洲色图网址 | 精品国产乱码久久久人妻 | 2012年免费中文视频 | 校草太大了h | 天天做天天爱天天爽综合区 | 日韩一区二区三区四区五区 | 国产亚洲精aa在线观看香蕉 | 精品一区二区国语对白 | 91短视频在线免费观看 | 青青草高清视频 | 好男人资源免费播放在线观看 | 91粉色视频在线导航 | 好男人社区www影院在线观看 | 韩国日本在线观看 | 国产成人精品本亚洲 | 99手机在线视频 | 99精彩免费观看 | 亚洲精品一区二区久久久久 | 精品欧美日韩一区二区三区 | 女人爽到喷水的视频免费看 | 99ri国产在线观看 | 高清女主播一区二区三区 | 欧美交换乱理伦片120秒 | 欧美大陆日韩一区二区三区 | www.尤物在线| 万域之王动漫在线观看全集免费播放 | 欧美日韩一区二区中文字幕视频 | 504神宫寺奈绪大战黑人 | sao虎在线精品永久 s0e一923春菜花在线播放 | 久久综久久美利坚合众国 | 99成人国产精品视频 | 欧美人体高清在线观看ggogo | 催眠白丝舞蹈老师小说 | 亚洲va精品中文字幕 | 成人免费淫片95视频观看网站 | 日本午夜小视频 | 精品久久99麻豆蜜桃666 | 日本网络视频www色高清免费 |