亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot使用異步注解@Async獲取執行結果

發布時間:2021-08-22 13:55:49 來源:億速云 閱讀:219 作者:chen 欄目:開發技術

這篇文章主要講解了“springboot使用異步注解@Async獲取執行結果”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“springboot使用異步注解@Async獲取執行結果”吧!

目錄
  • 一、引言

  • 二、獲取異步執行結果

    • 1、環境介紹

    • 2、錯誤的方式

    • 3、正確方式

  • 三、異步執行@Async注解

    • 四、總結

      一、引言

      在java后端開發中經常會碰到處理多個任務的情況,比如一個方法中要調用多個請求,然后把多個請求的結果合并后統一返回,一般情況下調用其他的請求一般都是同步的,也就是每個請求都是阻塞的,那么這個處理時間必定是很長的,有沒有一種方法可以讓多個請求異步處理那,答案是有的。

      springboot中提供了很便利的方式可以解決上面的問題,那就是異步注解@Async。正確的使用該注解可以使你的程序飛起,相反如果使用不當那么并不會取到理想的效果。

      二、獲取異步執行結果

      1、環境介紹

      下面是我的controller,SyncController.java

      package com.atssg.controller;
      
      import com.atssg.service.MySyncService;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      
      @Slf4j
      @RestController
      @RequestMapping("/sync")
      public class SyncController {
          @Autowired
          private MySyncService syncService;
      
          @GetMapping(value = "/test")
      
          public String test() {
              String str=null;
              try {
      
                  log.info("start");
                  str = syncService.asyncMethod();
                  log.info("str:{}", str);
                  return str;
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
              return str;
          }
      }

      在controller中就是調用下層的方法并返回,再看service層的類MySyncService.java

      package com.atssg.service;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.Future;
      
      @Service
      public class MySyncService {
          @Autowired
          private SyncService syncService;
      
          /**
           * 異步方法
           *
           * @return
           * @throws InterruptedException
           * @throws ExecutionException
           */
          public String asyncMethod() throws InterruptedException, ExecutionException {
      
              Future<String> result1 = syncService.method1("I");
              Future<String> result2 = syncService.method2("love");
              Future<String> result3 = syncService.method3("async");
      
              String str = result1.get();
              String str2 = result2.get();
              String str3 = result3.get();
      
              String result = str + str2 + str3;
      
              return result;
          }
      
          /**
           * 同步方法
           *
           * @return
           * @throws InterruptedException
           * @throws ExecutionException
           */
          public String syncMethod() throws InterruptedException, ExecutionException {
              /*同步寫法*/
              String str = syncService.method1("I").get();
              String str2 = syncService.method2("love").get();
              String str3 = syncService.method3("async").get();
              return str + str2 + str3;
          }
      }

      上面便是service類,僅僅是調用下次異步層的方法,并取得返回值。上面類中有兩個方法,其寫法也類似但結果卻大不相同,后面詳說。

      下面是異步層的方法,SyncService.java

      package com.atssg.service;
      
      import org.springframework.scheduling.annotation.Async;
      import org.springframework.scheduling.annotation.AsyncResult;
      import org.springframework.stereotype.Service;
      
      import java.util.concurrent.Future;
      
      @Service
      @Async
      public class SyncService {
      
          //@Async
          public Future<String> method1(String str) throws InterruptedException {
             Thread.sleep(1000*10);
              return new AsyncResult<>( str);
          }
          //@Async
          public Future<String> method2(String str) throws InterruptedException {
              Thread.sleep(1000*5);
              return new AsyncResult<>(str);
          }
         // @Async
          public Future<String> method3(String str) throws InterruptedException {
              Thread.sleep(1000*15);
              return new AsyncResult<>(str);
          }
      }

      該類使用@Async注解,表明該類中所有的方法都是異步執行的,其中@Async可修飾類也可以修飾方法。

      這便是所有的環境。

      2、錯誤的方式

      在MySyncService中有兩個方法,先看其中一個方法

      public String syncMethod() throws InterruptedException, ExecutionException {
              /*同步寫法*/
              String str = syncService.method1("I").get();
              String str2 = syncService.method2("love").get();
              String str3 = syncService.method3("async").get();
              return str + str2 + str3;
          }

      這種寫法是調用異步方法后立即調用get()方法,即獲取結果,下面看測試結果,在controllor中調用該方法,下面看執行結果

      2021-08-21 11:06:28.612  INFO 3584 --- [nio-8080-exec-1] com.atssg.controller.SyncController      : start
      2021-08-21 11:06:58.651  INFO 3584 --- [nio-8080-exec-1] com.atssg.controller.SyncController      : str:Iloveasync

      可以看到共執行了30s,在異步層的方法中的三個方法如下,

      //@Async
          public Future<String> method1(String str) throws InterruptedException {
             Thread.sleep(1000*10);
              return new AsyncResult<>( str);
          }
          //@Async
          public Future<String> method2(String str) throws InterruptedException {
              Thread.sleep(1000*5);
              return new AsyncResult<>(str);
          }
         // @Async
          public Future<String> method3(String str) throws InterruptedException {
              Thread.sleep(1000*15);
              return new AsyncResult<>(str);
          }

      可以看到這三個方法分別是睡眠10s、5s、15s,這就很好理解了syncMethod()方法中的寫法是同步的,未達到異步的目的,切記調用完異步方法進接著調用get()方法不是異步的方式,而是同步的。

      3、正確方式

      上面看了錯誤的用法,下面看正確的方式,

       public String asyncMethod() throws InterruptedException, ExecutionException {
      
              Future<String> result1 = syncService.method1("I");
              Future<String> result2 = syncService.method2("love");
              Future<String> result3 = syncService.method3("async");
      
              String str = result1.get();
              String str2 = result2.get();
              String str3 = result3.get();
      
              String result = str + str2 + str3;
      
              return result;
          }

      這種方式是首先調用異步方法,然后分別調用get()方法,取得執行結果。下面看測試結果

      2021-08-21 11:17:23.516  INFO 3248 --- [nio-8080-exec-1] com.atssg.controller.SyncController      : start
      2021-08-21 11:17:38.535  INFO 3248 --- [nio-8080-exec-1] com.atssg.controller.SyncController      : str:Iloveasync

      執行時間未15s,這就很好解釋了,異步層的三個方法,分別睡眠的時間是10s、5s、15s,既然是異步執行的,那么總的執行時間肯定是三個方法中最長的那個,符合測試結果。這才@Async正確的打開姿勢。

      三、異步執行@Async注解

      @Async注解的定義如下,

      @Target({ElementType.TYPE, ElementType.METHOD})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface Async {
          String value() default "";
      }

      可以看到該注解可以用在類及方法上,用在類上表示類中的所有方法都是異步的,用在方法上表示該方法是異步的。

      四、總結

      今天的文章分享到這里,主要分享了關于@Async注解在獲取執行結果的時候的坑,一定要先調用異步方法,然后再調用get()方法,獲取結果,其中get方法還有一個重載的,可以設置超時時間,即超過設置的超時時間便返回,不再等待,各位小伙伴可以自己試驗。

       V get(long timeout, TimeUnit unit)
              throws InterruptedException, ExecutionException, TimeoutException;
      }

      下次繼續分享有關@Async注解使用的一些小細節,歡迎持續關注。

      感謝各位的閱讀,以上就是“springboot使用異步注解@Async獲取執行結果”的內容了,經過本文的學習后,相信大家對springboot使用異步注解@Async獲取執行結果這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

      向AI問一下細節

      免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

      AI

      札达县| 南溪县| 漳平市| 游戏| 黄骅市| 三台县| 泰州市| 伊吾县| 进贤县| 盐津县| 东丽区| 东莞市| 纳雍县| 高阳县| 东海县| 万年县| 咸宁市| 东平县| 嘉定区| 芜湖县| 镇平县| 开原市| 射阳县| 庄河市| 曲周县| 克什克腾旗| 睢宁县| 乌恰县| 合山市| 太仆寺旗| 浮山县| 苏尼特右旗| 西安市| 桑日县| 布拖县| 蒙城县| 顺昌县| 宣威市| 福州市| 仁怀市| 乌苏市|