springboot~CompletableFuture並行計算

来源:https://www.cnblogs.com/lori/p/18174868
-Advertisement-
Play Games

在Spring中,CompletableFuture通常用於非同步編程,可以方便地處理非同步任務的執行和結果處理,CompletableFuture 是 Java 8 引入的一個類,用於支持非同步編程和併發操作。它基於 Future 和 CompletionStage 介面,提供了豐富的方法來處理非同步任務 ...


在Spring中,CompletableFuture通常用於非同步編程,可以方便地處理非同步任務的執行和結果處理,CompletableFuture 是 Java 8 引入的一個類,用於支持非同步編程和併發操作。它基於 Future 和 CompletionStage 介面,提供了豐富的方法來處理非同步任務的執行和結果處理。

下麵是 CompletableFuture 實現的一些關鍵原理:

  1. 線程池支持CompletableFuture 內部使用線程池來執行非同步任務,可以通過指定不同的線程池來控制任務的執行方式。預設情況下,CompletableFuture 使用 ForkJoinPool.commonPool() 作為預設的線程池。

  2. 回調函數CompletableFuture 支持鏈式調用,可以通過 thenApply(), thenAccept(), thenRun(), thenCompose() 等方法添加回調函數,在非同步任務完成後處理任務的結果或執行下一步操作。

  3. 異常處理CompletableFuture 提供了 exceptionally(), handle(), whenComplete() 等方法來處理非同步任務中可能拋出的異常,確保異常能夠被捕獲並處理。

  4. 組合操作CompletableFuture 支持多個 CompletableFuture 對象之間的組合操作,如 thenCombine(), thenCompose(), allOf(), anyOf() 等方法,實現並行執行、串列執行、等待所有任務完成等功能。

  5. CompletableFuture 工廠方法:除了 supplyAsync() 方法外,CompletableFuture 還提供了一系列工廠方法來創建 CompletableFuture 對象,如 runAsync(), completedFuture(), failedFuture() 等,方便快速創建並管理非同步任務。

總的來說,CompletableFuture 的實現基於 Future 和 CompletionStage 介面,利用線程池、回調函數、異常處理、組合操作等機制,提供了強大而靈活的非同步編程功能,使得開發人員能夠更加方便地處理非同步任務的執行和結果處理。

使用方法(一)鏈式

如果我們的業務方法已經寫完了,這時可以直接通過supplyAsync方法來調用這些已知的方法,而不需要重新開發

CompletableFuture<String> a1 = CompletableFuture.supplyAsync(() -> {
      try {
          Thread.sleep(1000);
      } catch (InterruptedException e) {
          throw new RuntimeException(e);
      }
      return "Hello World";
  });
  CompletableFuture<String> a2 = CompletableFuture.supplyAsync(() -> {
      try {
          Thread.sleep(2000);
      } catch (InterruptedException e) {
          throw new RuntimeException(e);
      }
      return "Hello World";
  });
  CompletableFuture<String> a3 = CompletableFuture.supplyAsync(() -> {
      try {
          Thread.sleep(3000);
      } catch (InterruptedException e) {
          throw new RuntimeException(e);
      }
      return "Hello World";
  });

  // 這塊最後是並行計算時間為3秒
  CompletableFuture.allOf(a1, a2, a3).join();

  String result = a1.get() + " | " + a2.get() + " | " + a3.get();

使用方法(二)獨立方法

如果方法比較獨立,並且之前沒有開發過,那麼你可以通過非同步方法來將這些邏輯與調用代碼解耦

@Service
@EnableAsync
public class ParallelTaskService {

    @Async
    public CompletableFuture<String> task1() {
        // 模擬一個耗時操作
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return CompletableFuture.completedFuture("Task 1 completed");
    }

    @Async
    public CompletableFuture<String> task2() {
        // 模擬另一個耗時操作
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return CompletableFuture.completedFuture("Task 2 completed");
    }
}

// 並行計算時,響應時間是2和3秒之中最大值,即3秒
@GetMapping("/hello-world2")
public CompletableFuture<String> helloWorld2() {
    CompletableFuture<String> task1Result = parallelTaskService.task1();
    CompletableFuture<String> task2Result = parallelTaskService.task2();

    // 等待所有任務都完成
    CompletableFuture<Void> allOf = CompletableFuture.allOf(task1Result, task2Result);

    // 處理所有任務完成後的邏輯
    return allOf.thenApply(voidResult -> {
        String result = task1Result.join() + " | " + task2Result.join();
        return result;
    });
}

作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980

支付寶掃一掃,為大叔打賞!


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

-Advertisement-
Play Games
更多相關文章
  • 刪除A中與B相同的元素 目錄刪除A中與B相同的元素程式驗證輸出結果 程式 #include <stdio.h> /******************************************************************* * * file name: 刪除A中與B相同的元 ...
  • OutOfMemoryError是Java程式中常見的異常,通常出現在記憶體不足時,導致程式無法運行。藉助MAT記憶體分析工具分析可能的記憶體泄漏代碼問題定位。 ...
  • 具有查看日期時間、天氣、工作日、記錄喝水、查詢微博熱搜、60s讀世界和各種小工具的桌面工具,可以在托盤區單擊隱藏和彈出,或使用快捷鍵Alt+1 ...
  • 變數、指針和關鍵字 兩個口訣: 變數變數,能變,就是能讀能寫,必定在記憶體(RAM)里 指針指針,保存的是地址,32 位處理器中的地址都是 32 位的,無論是什麼類型的指針變數,都是 4 位元組 指針 對於 32 位處理器裡面,地址是 32 位的,所以指針的大小為 4 位元組,sizeof(p) = 4 ...
  • MyBatis筆記 MyBatis介紹 MyBatis 是一個持久層框架 前身是ibatis, 在ibatis3.x 時,更名為MyBatis MyBatis 在java 和sql 之間提供更靈活的映射方案 mybatis 可以將對數據表的操作(sql,方法)等等直接剝離,寫到xml 配置文件,實現 ...
  • 在電子商務系統中,SKU(Stock Keeping Unit,庫存單位)和SPU(Standard Product Unit,標準產品單位)是兩種不同的概念,它們共同用於商品管理和庫存控制。雖然理論上可以只使用SKU來管理商品,但在實際應用中,同時使用SPU和SKU有其明顯的優勢和必要性。 SKU ...
  • 這一篇文章拖了有點久,雖然在項目中使用分散式鎖的頻率比較高,但整理成文章發佈出來還是花了一點時間。在一些移動端、用戶量大的互聯網項目中,經常會使用到 Redis 分散式鎖作為控制訪問高併發的工具。 ...
  • 作者:avengerEug 鏈接:https://juejin.cn/post/6984574787511123999 前言 經過前面對Spring AOP、事務的總結,我們已經對它們有了一個比較感性的認知了。 今天,我繼續安利一個獨門絕技:Spring 事務的鉤子函數。單純的講技術可能比較枯燥乏味 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...