欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

舉例

如果我們想拉取三個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)拉取時(shí)間是2秒鐘,想將結(jié)果統(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());
    }

結(jié)果:共耗時(shí)6秒(一個(gè)結(jié)果2秒)

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

問題

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

解決

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

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

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

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

當(dāng)前執(zhí)行流程

為什么耗時(shí)是2秒:

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

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

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

那么要等多久呢?

這三個(gè)人幾乎是同時(shí)走向這輛車的,但是無論其他人走多快,因?yàn)榈谜R齊,所以耗時(shí)取決于這三個(gè)坑位,最慢上車的那個(gè)人。

如果我把其中一個(gè)B線程改為10秒

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

 

注意:

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Springboot升級到2.7.2結(jié)合nacos遇到的坑及解決

    Springboot升級到2.7.2結(jié)合nacos遇到的坑及解決

    這篇文章主要介紹了Springboot升級到2.7.2結(jié)合nacos遇到的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • SpringBoot中的@PreAuthorize注解詳解

    SpringBoot中的@PreAuthorize注解詳解

    這篇文章主要介紹了SpringBoot中的@PreAuthorize注解詳解,@PreAuthorize注解會在方法執(zhí)行前進(jìn)行權(quán)限驗(yàn)證,支持Spring?EL表達(dá)式,它是基于方法注解的權(quán)限解決方案,需要的朋友可以參考下
    2023-09-09
  • java讀取txt文件內(nèi)容簡單舉例

    java讀取txt文件內(nèi)容簡單舉例

    這篇文章主要給大家介紹了關(guān)于java讀取txt文件內(nèi)容簡單舉例的相關(guān)資料,通常我們可以直接通過文件流來讀取txt文件的內(nèi)容,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Spring Boot JDBC 連接數(shù)據(jù)庫示例

    Spring Boot JDBC 連接數(shù)據(jù)庫示例

    本篇文章主要介紹了Spring Boot JDBC 連接數(shù)據(jù)庫示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • java實(shí)現(xiàn)簡單QQ登錄界面

    java實(shí)現(xiàn)簡單QQ登錄界面

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單QQ登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • elasticsearch的靈魂唯一master選舉機(jī)制原理分析

    elasticsearch的靈魂唯一master選舉機(jī)制原理分析

    這篇文章主要為大家介紹了elasticsearch的靈魂唯一master選舉機(jī)制原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 異常try?catch的常見四類方式(案例代碼)

    異常try?catch的常見四類方式(案例代碼)

    這篇文章主要介紹了異常try?catch的常見四類方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Sa-Token中的SaSession對象使用學(xué)習(xí)示例詳解

    Sa-Token中的SaSession對象使用學(xué)習(xí)示例詳解

    這篇文章主要為大家介紹了Sa-Token中的SaSession對象使用學(xué)習(xí)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Spring Boot定時(shí)任務(wù)單線程多線程實(shí)現(xiàn)代碼解析

    Spring Boot定時(shí)任務(wù)單線程多線程實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了Spring Boot定時(shí)任務(wù)單線程多線程實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別介紹實(shí)例詳解

    Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別介紹實(shí)例詳解

    本篇文章主要介紹了Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別,需要的朋友可以參考
    2017-04-04

最新評論