最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot中@Async異步,實現(xiàn)異步結果合并統(tǒng)一返回方式

 更新時間:2023年09月27日 08:55:36   作者:Yang瘋狂打碼中  
這篇文章主要介紹了Springboot中@Async異步,實現(xiàn)異步結果合并統(tǒng)一返回方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

@Async異步,實現(xiàn)異步結果合并統(tǒng)一返回

本文是為了實現(xiàn)在SpringBoot中使用@Async異步時,將所有異步返回的結果合并。

舉例

如果我們想拉取三個數(shù)據(jù),每個數(shù)據(jù)拉取時間是2秒鐘,想將結果統(tǒng)一返回給前端,以往我們都是這么做

    @Override
    public SysUser getUserA() throws InterruptedException {
        System.out.println("A線程:"+Thread.currentThread().getId());
        SysUser sysUser = new SysUser();
        sysUser.setUserName("A用戶");
        Thread.sleep(2000L);
        System.out.println("A 拉取成功");
        return sysUser;
    }
    @Override
    public SysUser getUserB() throws InterruptedException {
        System.out.println("B線程:"+Thread.currentThread().getId());
        SysUser sysUser = new SysUser();
        sysUser.setUserName("B用戶");
        Thread.sleep(2000L);
        System.out.println("B 拉取成功");
        return sysUser;
    }
    @Override
    public SysUser getUserC() throws InterruptedException {
        System.out.println("C線程:"+Thread.currentThread().getId());
        SysUser sysUser = new SysUser();
        sysUser.setUserName("C用戶");
        Thread.sleep(2000L);
        System.out.println("C 拉取成功");
        return sysUser;
    }

執(zhí)行拉取測試

    @Test
    public void testAsync() throws Exception{
        System.out.println(new Date());
        SysUser a = sysUserService.getUserA();
        SysUser b = sysUserService.getUserB();
        SysUser c = sysUserService.getUserC();
        List<SysUser> list = new ArrayList<>(Arrays.asList(a,b,c));
        list.forEach(user->{
            System.out.println(user.getUserName());
        });
        System.out.println(new Date());
    }

結果:共耗時6秒(一個結果2秒)

如果我們有個需求 ,這三個數(shù)據(jù)一起返回給前端不能超過5秒,這種情形我們就會使用到異步,

問題

但是如果使用異步,主線程不會等待異步線程返回,會直接執(zhí)行之后代碼返回前端(如下圖),前端接收到的就是null

解決

如果我們想達到異步的結果統(tǒng)一返回,就需要使用到CompletableFuture

注:使用@Async時,需要@EnableAsync開啟異步,調(diào)用@Async的方法不能與@Async所在同一個類中

執(zhí)行測試:等待異步返回,并收集結果,使用.get獲取返回值

結果:可以看出每個方法都是異步并行,2秒就即可返回三個合并后的結果

當前執(zhí)行流程

為什么耗時是2秒:

CompletableFuture.allOf(a,b,c).join();

我們這里 allOf 傳遞了 三個 異步線程的返回值, 所以看到上圖,也就出現(xiàn)了三個等待返回值的坑位 A B C。

可以把這個想象成一輛車,三個位, 必須人滿才發(fā)車。

那么要等多久呢?

這三個人幾乎是同時走向這輛車的,但是無論其他人走多快,因為得整整齊齊,所以耗時取決于這三個坑位,最慢上車的那個人。

如果我把其中一個B線程改為10秒

結果:可以看出B線程拉取的最慢,并且總耗時為10秒

 

注意:

其實,只要你使用到了  返回接收值CompletableFuture ,其實就已經(jīng)開始觸發(fā),并不是一定要用allOf。 

例如:如果我們在使用CompletableFuture時,在異步中途使用到返回值,那么主線程會等待這個異步線程返回

結果:可以看出主線程一直在等待B線程的返回結果,等待10秒后才繼續(xù)直接線程C

心得:只要調(diào)用了get(),主線程就會等待異步線程結果的返回

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot實現(xiàn)PPT格式文件上傳并在線預覽功能

    SpringBoot實現(xiàn)PPT格式文件上傳并在線預覽功能

    本文介紹SpringBoot實現(xiàn)PPT格式文件上傳并在線預覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預覽時會在同級目錄下創(chuàng)建一個相同文件名后綴為pdf的文件,每次預覽會先查找文件是否存在,存在則直接預覽,不存在則會走上面的處理,需要的朋友可以參考下
    2022-02-02
  • Spring?MVC各種參數(shù)進行封裝的方法實例

    Spring?MVC各種參數(shù)進行封裝的方法實例

    這篇文章主要給大家介紹了關于Spring?MVC各種參數(shù)進行封裝的相關資料,SpringMVC內(nèi)置多種數(shù)據(jù)類型轉換器,可以根據(jù)請求中的參數(shù)與后端控制器方法的參數(shù)的關系為我們實現(xiàn)簡單的數(shù)據(jù)封裝,需要的朋友可以參考下
    2023-06-06
  • 一文看懂RabbitMQ消息丟失如何防止

    一文看懂RabbitMQ消息丟失如何防止

    這篇文章主要介紹了RabbitMQ消息丟失的場景,以及如何保證信息不丟失,看完這篇文章一定可以幫助你RabbitMQ有更深的理解,需要的朋友可以參考下
    2023-03-03
  • Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼

    Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼

    這篇文章主要介紹了Java利用Redis實現(xiàn)高并發(fā)計數(shù)器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Java Servlet上傳圖片到指定文件夾并顯示圖片

    Java Servlet上傳圖片到指定文件夾并顯示圖片

    在學習Servlet過程中,針對圖片上傳做了一個Demo,如果大家對Java Servlet上傳圖片到指定文件夾并顯示圖片功能感興趣的朋友大家通過本文一起學習吧
    2017-08-08
  • Mybatis中的游標查詢Cursor(滾動查詢)

    Mybatis中的游標查詢Cursor(滾動查詢)

    這篇文章主要介紹了Mybatis中的游標查詢Cursor(滾動查詢),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 解決maven?maven.compiler.source和maven.compiler.target的坑

    解決maven?maven.compiler.source和maven.compiler.target的坑

    這篇文章主要介紹了解決maven?maven.compiler.source和maven.compiler.target的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Log4j_配置方法(全面講解)

    Log4j_配置方法(全面講解)

    下面小編就為大家?guī)硪黄狶og4j_配置方法(全面講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java實現(xiàn)順序表的操作詳解

    Java實現(xiàn)順序表的操作詳解

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結構,一般情況下采用數(shù)組存儲。本文主要介紹了順序表的實現(xiàn)與常用操作,需要的可以參考一下
    2022-09-09
  • Java獲取線程ID的實例

    Java獲取線程ID的實例

    以下實例演示了如何使用 getThreadId() 方法獲取線程id,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10

最新評論

尼勒克县| 松原市| 太谷县| 海林市| 布尔津县| 剑川县| 德兴市| 芦溪县| 镇江市| 广平县| 阳信县| 密云县| 河曲县| 公安县| 台北县| 侯马市| 稻城县| 佳木斯市| 柞水县| 韶关市| 连城县| 伊川县| 中西区| 乌兰察布市| 天峨县| 石泉县| 红安县| 三明市| 三门峡市| 巴彦淖尔市| 赤壁市| 黄陵县| 绥江县| 玉龙| 南丹县| 驻马店市| 土默特左旗| 朝阳市| 洮南市| 万山特区| 凤山市|