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


  本篇文章主要介紹了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

  42package 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

  46package 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM