CompletableFuture的入門

来源:https://www.cnblogs.com/hitechr/archive/2022/06/29/16423413.html
-Advertisement-
Play Games

runAsync 和 supplyAsync runAsync接受一個Runable的實現,無返回值 CompletableFuture.runAsync(()->System.out.println("無返回結果的運行")); supplyAsync接受一個Supplier的實現,有返回值 Com ...


runAsync 和 supplyAsync

runAsync接受一個Runable的實現,無返回值

CompletableFuture.runAsync(()->System.out.println("無返回結果的運行"));

supplyAsync接受一個Supplier的實現,有返回值

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
      System.out.println("有返回結果的運行");
      return 1;
  });

獲取結果的get和join

都是堵塞,直到返回結果
get方法拋出是經過處理的異常,ExecutionException或**InterruptedException **,需要用戶手動捕獲

try {
   System.out.println(CompletableFuture.supplyAsync(() -> {
    System.out.println("有返回結果的運行");
    return 1;
  }).get());
} catch (InterruptedException e) {
  e.printStackTrace();
} catch (ExecutionException e) {
  e.printStackTrace();
}

join方法拋出的就不用捕獲,是經過包裝的**CompletionException **或 CancellationException

        System.out.println(CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.MILLISECONDS.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("有返回結果的運行");
            return 1;
        }).join());

常用方法

獲取結果的get\join\getNow

get():一直等待
get(timeout,unit):等待,除非超時
getNow(valueIfAbsent):計算完返回計算的結果,未計算完返回預設的結果

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {

            try {
                TimeUnit.SECONDS.sleep(1);
                ;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 1;
        });

        System.out.println("立即獲取:"+completableFuture.getNow(9999));
        try {
            TimeUnit.SECONDS.sleep(2);
            System.out.println("doing");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("等一會獲取:"+completableFuture.getNow(9999));

join() 同get()

thenApply\handle

執行完前面的,前面返回的結果返回,然後傳給後面再,執行完後面任務,一步一步來。

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
    System.out.println("step 1");
    return 1;
}).thenApply(a -> {
    System.out.println("step 2");
    return a + 2;
}).thenApply(a -> {
    System.out.println("step 3");
    return a + 3;
});
System.out.println(completableFuture.get());

執行結果:

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
    System.out.println("step 1");
    int a=1/0;
    return 1;
}).handle((a,b) -> {
    System.out.println("step 2");
    if (b!=null) {
        System.out.println(b.getMessage());
        return 0;
    }
    return a + 2;
}).handle((a,b) -> {
    System.out.println("step 3");
    if (b!=null) {
        System.out.println(b.getMessage());
        return 0;
    }
    return a + 3;
});
System.out.println(completableFuture.get());

執行結果:

thenApply和handle的區別:
thenApply執行的時候,有異常的則整個執行鏈會中斷,直接拋出異常。

handle有異常也可以往下一步走,根據帶的異常參數可以進一步處理

thenAccept

接收前面任務的返回結果,當前節點處理,並不返回結果。

CompletableFuture.supplyAsync(()->{
    System.out.println("step 1");
    return 10;
}).thenAccept(a->{
    System.out.println("res "+a);
});

applyToEither

在多個任務段同時執行時,哪個任務段用時最少,就返回哪個

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
    System.out.println("step 1");
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 1;
}).applyToEither(CompletableFuture.supplyAsync(() -> {
    System.out.println("step 2");
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 2;
}), a -> {
    return a;
});
System.out.println(completableFuture.get());

執行結果:

thenCombine

合併多個任務段的返回結果

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println("step 1");
            return IntStream.range(1, 11).sum();
        }).thenCombine(CompletableFuture.supplyAsync(() -> {
            System.out.println("step 2");
            return IntStream.range(11, 21).sum();
        }), (a, b) -> a + b)
        .thenCombine(CompletableFuture.supplyAsync(() -> {
            System.out.println("step 3");
            return IntStream.range(21, 31).sum();
        }), (a, b) -> a + b);
System.out.println(completableFuture.get());

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨晚我正在床上睡得著著的,突然來了一條簡訊。 啥,線上MySQL死鎖了,我趕緊登錄線上系統,查看業務日誌。 ...
  • 打開源代碼發現了個./time.php?source 於是打開點進去 <?php #error_reporting(0); class HelloPhp { public $a; public $b; public function __construct(){ $this->a = "Y-m-d ...
  • 來源:blog.csdn.net/qq_29879799/article/details/105146415 java的stream編程給調試帶來了極大的不便,idea 推出了streamtrace功能,可以詳細看到每一步操作的關係、結果,非常方便進行調試。 初遇StreamTrace 這裡簡單將字 ...
  • The DataStream API gets its name from the special DataStream class that is used to represent a collection of data in a Flink program. You can think of ...
  • 參考:(17條消息) 手把手搭建一個完整的javaweb項目(適合新手)_心歌技術的博客-CSDN博客_javaweb項目完整案例 補充項目結構的細節,進行了一點修改,修改為學生信息管理系統 以下是搭建過程: 1.項目結構 2.資料庫結構 3.代碼部分 com.dao.StuDao.java pac ...
  • 背景:[JAVA]前幾天面試超碧,聊到其接觸的項目,有抓取各類排行的實時數據,進行多國語言翻譯,抓取目前比較火的語言是php、go,由於目前工作使用JAVA,因此也模擬實現了一下抓取百度熱搜榜實時數據。 效果: 步驟: 1、定址【百度熱搜榜】https://top.baidu.com/board?t ...
  • java集合 學習資源:b站 人人都是程式員 《看動畫學java集合》 b站 韓順平 《java集合》 感謝二位的開源視頻,本博客為個人筆記,如有錯誤還請包涵 學習方法:推薦觀看視頻,自己用idea敲一遍然後debug一步步看,最後自己寫筆記和畫流程圖。 前 言 目的:為了方便和高效地存儲大批量的數 ...
  • Hi,大家好,我是Mic。 一個工作5年的粉絲,在簡歷上寫精通Kafka。 結果在面試的時候直接打臉。 面試官問他:“什麼是ISR,為什麼需要設計ISR” 然後他一臉懵逼的看著面試官. 下麵看看普通人和高手的回答。 普通人: ISR好像是Kafka裡面的一個機制吧。 為什麼要引入,應該是跟數據同步有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...