亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Boot集成教程之異步調用Async

2024-07-14 08:40:08
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于Spring Boot集成之異步調用Async的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

什么是異步調用?

異步調用是相對于同步調用而言的,同步調用是指程序按預定順序一步步執行,每一步必須等到上一步執行完后才能執行,異步調用則無需等待上一步程序執行完即可執行。

異步處理方式

  • 調用之后,不返回任何數據。
  • 調用之后,返回數據,通過Future來獲取返回數據

如何實現異步調用?

多線程,這是很多人第一眼想到的關鍵詞,沒錯,多線程就是一種實現異步調用的方式。

在非spring目項目中我們要實現異步調用的就是使用多線程方式,可以自己實現Runable接口或者集成Thread類,或者使用jdk1.5以上提供了的Executors線程池。

StrngBoot中則提供了很方便的方式執行異步調用。

按照官方示例開擼

代碼入下

maven依賴:

<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>1.5.3.RELEASE</version> </parent> <dependencies>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency> </dependencies> 

啟動類:添加@EnableAsync注解

@SpringBootApplication @EnableAsync public class Application{   public static void main(String[] args) {   SpringApplication.run(Application.class, args);  } } 

Controller

只需在需要異步執行方法上添加@Async注解

@RestController @RequestMapping("") public class AsyncTaskController {  @RequestMapping("")  public String doTask() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   this.task1();   this.task2();   this.task3();   long currentTimeMillis1 = System.currentTimeMillis();   return "task任務總耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms";  }    @Async  public void task1() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(1000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task1任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");  }    @Async  public void task2() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(2000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task2任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");  }  @Async  public void task3() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(3000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task3任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");  } } 

main函數運行spirngboot項目,啟動完成后瀏覽器訪問:http://localhost:8080/

控制臺:

task1任務耗時:1012ms task2任務耗時:2009ms task3任務耗時:3004ms 

等了一段瀏覽器時候輸出入下:

task任務總耗時:6002ms 

異步并沒有執行!

難道是代碼寫錯了?反復檢查了好幾遍,并沒有發現什么明顯錯誤,想起spring對@Transactional注解時也有類似問題,spring掃描時具有@Transactional注解方法的類時,是生成一個代理類,由代理類去開啟關閉事務,而在同一個類中,方法調用是在類體內執行的,spring無法截獲這個方法調用。

豁然開朗,將異步任務單獨放到一個類中,調整代碼入下:

Controller

@RequestMapping("") @RestController public class AsyncTaskController {  @Autowired  private AsyncTask asyncTask;  @RequestMapping("")  public String doTask() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   asyncTask.task1();   asyncTask.task2();   asyncTask.task3();   long currentTimeMillis1 = System.currentTimeMillis();   return "task任務總耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms";     } } 

異步任務類

@Component public class AsyncTask {  @Async  public void task1() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(1000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task1任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");  }    @Async  public void task2() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(2000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task2任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");  }  @Async  public void task3() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(3000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task3任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");  } } 

控制臺:

task1任務耗時:1012ms task2任務耗時:2009ms task3任務耗時:3004ms 

訪問瀏覽器結果入下:

task任務總耗時:19ms 

異步調用成功!

如何知道三個異步任務什么時候執行完,執行的結果怎樣呢?可以采用添加Fature回調方式判斷

代碼入下:

異步任務類

@Component public class AsyncTask {  @Async  public Future<String> task1() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(1000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task1任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");   return new AsyncResult<String>("task1執行完畢");  }    @Async  public Future<String> task2() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(2000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task2任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");   return new AsyncResult<String>("task2執行完畢");  }  @Async  public Future<String> task3() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Thread.sleep(3000);   long currentTimeMillis1 = System.currentTimeMillis();   System.out.println("task3任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");   return new AsyncResult<String>("task3執行完畢");  } } 

Controller

@RequestMapping("") @RestController public class AsyncTaskController {  @Autowired  private AsyncTask asyncTask;  @RequestMapping("")  public String doTask() throws InterruptedException{   long currentTimeMillis = System.currentTimeMillis();   Future<String> task1 = asyncTask.task1();   Future<String> task2 = asyncTask.task2();   Future<String> task3 = asyncTask.task3();   String result = null;   for (;;) {    if(task1.isDone() && task2.isDone() && task3.isDone()) {     // 三個任務都調用完成,退出循環等待     break;    }    Thread.sleep(1000);   }   long currentTimeMillis1 = System.currentTimeMillis();   result = "task任務總耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms";   return result;  } } 

控制臺輸出:

task1任務耗時:1000ms task2任務耗時:2001ms task3任務耗時:3001ms 

瀏覽器輸出:

task任務總耗時:4015ms

異步調用成功,并且在所有任務都完成時程序才返回了結果!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线性视频| 久热爱精品视频线路一| 成人欧美在线观看| 国产精品福利观看| 久久久91精品国产一区不卡| 久久国产精品久久久久久久久久| 91精品国产高清自在线看超| 久久久精品亚洲| 欧美老女人性视频| 成人写真福利网| 国产精品日韩专区| 精品国产一区二区三区久久久| 黄色一区二区三区| 91高清在线免费观看| 91av视频导航| 国产午夜精品全部视频在线播放| 国产精品h片在线播放| 亚洲电影免费观看高清完整版在线| 亚洲精品免费在线视频| 欧美黑人狂野猛交老妇| 亚洲免费精彩视频| 日本久久久久久久久久久| 最近2019中文免费高清视频观看www99| 国产精品视频久久久久| 国产精品高清免费在线观看| 国产99视频在线观看| 国产日韩精品综合网站| 另类视频在线观看| 欧美电影免费在线观看| 国产成人小视频在线观看| 日韩在线中文视频| 亚洲最新视频在线| 亚洲精品小视频在线观看| 综合激情国产一区| 91久久精品久久国产性色也91| 日韩在线观看电影| 亚洲精品久久久久中文字幕欢迎你| 97碰在线观看| 亚洲999一在线观看www| 国产欧美日韩综合精品| 亚洲性猛交xxxxwww| 中文字幕精品www乱入免费视频| 一区二区在线视频播放| 91国内产香蕉| 亚洲成人av片在线观看| 日韩成人免费视频| 欧美精品久久久久久久免费观看| 亚洲电影天堂av| 日韩欧美精品网址| 欧洲成人在线观看| 亚洲国产精品成人va在线观看| 国产精品久久久91| 亚洲精品久久久久久下一站| 欧美影院成年免费版| 亚洲精选在线观看| 欧美性猛交xxxx免费看漫画| 国产69精品久久久久久| 欧美高清视频免费观看| 亚洲的天堂在线中文字幕| 亚洲性xxxx| 久久成人免费视频| 国产精品美乳一区二区免费| 91亚洲午夜在线| 欧美日韩在线免费观看| 日韩av电影手机在线| 国产一区二区久久精品| 狠狠做深爱婷婷久久综合一区| 国产精品久久电影观看| 日韩在线视频中文字幕| 91精品久久久久久久久不口人| 国内免费精品永久在线视频| 欧美与黑人午夜性猛交久久久| 国产精品丝袜白浆摸在线| 亚洲第一精品电影| 高跟丝袜一区二区三区| 亚洲综合精品伊人久久| 91超碰caoporn97人人| 国产日韩精品在线播放| 久久视频在线免费观看| 91精品国产自产在线| 久久久欧美一区二区| 午夜精品一区二区三区av| 欧美激情精品久久久久久久变态| 91精品久久久久久久久久久久久久| 97视频在线观看免费高清完整版在线观看| 4p变态网欧美系列| 亚洲色图偷窥自拍| 国产高清在线不卡| 超碰97人人做人人爱少妇| 久久亚洲欧美日韩精品专区| 日韩中文在线观看| 久久精品亚洲一区| 欧美电影在线免费观看网站| 国产精品一区二区女厕厕| 中文字幕在线看视频国产欧美在线看完整| 亚洲欧洲激情在线| 欧美性猛交xxxx黑人| 中文字幕亚洲欧美一区二区三区| 国产福利成人在线| 国产视频999| 国产日韩精品一区二区| 亚洲人成网站777色婷婷| 国产精品久久99久久| 不卡毛片在线看| 色妞久久福利网| 欧美激情精品久久久| 中文字幕精品视频| 91久久精品久久国产性色也91| 成人免费自拍视频| 中文字幕久热精品视频在线| 美女扒开尿口让男人操亚洲视频网站| 久久久精品影院| 欧美伊久线香蕉线新在线| 日韩在线激情视频| 久久国产精品久久久久久久久久| 91系列在线播放| 欧美成人免费观看| 狠狠躁天天躁日日躁欧美| 欧洲成人免费视频| 亚洲精品视频网上网址在线观看| 日本成熟性欧美| 亚洲人精选亚洲人成在线| 国产亚洲日本欧美韩国| 国产一区二区三区在线观看视频| 精品国产欧美成人夜夜嗨| 国产91av在线| 成人国内精品久久久久一区| 国产视频精品自拍| 国产在线高清精品| 日韩av中文字幕在线免费观看| 伊人久久大香线蕉av一区二区| 欧美成人激情图片网| 成人日韩av在线| 亚洲精品中文字幕女同| 精品一区电影国产| 中文亚洲视频在线| 欧美成人自拍视频| 久久韩剧网电视剧| 国产精品一区二区久久精品| 国产91在线播放精品91| 精品女厕一区二区三区| 亚洲国产成人精品女人久久久| 亚洲欧美国产另类| 国产精品永久在线| 国产91精品网站| 国产精品美女av| 国产精品成人av性教育| 欧美大人香蕉在线| 亚洲最大成人在线| 亚洲а∨天堂久久精品喷水| 欧美xxxx做受欧美| 日韩中文字幕视频| 久久久女人电视剧免费播放下载| 欧美色图在线视频| 日韩在线免费高清视频| 欧美大片在线免费观看| 日韩中文字幕第一页| 久久综合久久88| 国产精品色午夜在线观看| 国产精品91在线观看| 欧美另类第一页| 红桃视频成人在线观看| 亚洲一区二区三区久久| 午夜免费在线观看精品视频|