激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - Java教程 - 詳解springboot使用異步注解@Async獲取執行結果的坑

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

2021-11-29 11:50北漂程序員 Java教程

本文主要介紹了springboot使用異步注解@Async獲取執行結果的坑,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、引言

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

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

二、獲取異步執行結果

1、環境介紹

下面是我的controller,SyncController.java

?
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
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

?
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
47
48
49
50
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

?
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
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中有兩個方法,先看其中一個方法

?
1
2
3
4
5
6
7
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,在異步層的方法中的三個方法如下,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//@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、正確方式

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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注解的定義如下,

?
1
2
3
4
5
6
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {
    String value() default "";
}

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

四、總結

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

?
1
2
3
V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

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

到此這篇關于詳解springboot使用異步注解@Async獲取執行結果的坑的文章就介紹到這了,更多相關springboot使用異步注解@Async 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/teach/p/15169153.html

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 在线免费亚洲 | 福利在线小视频 | 日本在线看 | 电影av在线 | 天堂亚洲一区 | 斗罗破苍穹在线观看免费完整观看 | 在线观看视频日本 | 精品国产一区二区三区天美传媒 | 天天碰天天操 | 欧美一级网 | 国产超碰人人做人人爱ⅴa 色天天综合网 | 日韩视频一区二区三区在线观看 | 亚洲一区在线国产 | 欧美在线观看黄色 | 国产手机在线视频 | 亚洲一区二区三区四区精品 | 黄色小视频在线免费看 | 亚洲午夜天堂吃瓜在线 | 成品片a免人视频 | 久久精品av| 久久毛片 | 国产一级做a爰片在线看 | 国产高清自拍一区 | 12av电影| 国产精品久久久久久久av | 美女久久久久 | 国产一区视频免费观看 | chinesegv男男猛男无套 | 日本中文字幕高清 | 国产免费一区二区三区 | 精品久久久久久久久久久αⅴ | 久久久久久久久国产精品 | 九九久久视频 | 草莓福利视频在线观看 | 国产大片中文字幕在线观看 | 成人久久18免费 | 欧美18videos性处按摩 | 免费黄色大片网站 | 性明星video另类hd | 国产在线区 | 国产精品18久久久久久久久 |