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

Java中FutureTask 和 CompletableFuture的區(qū)別

 更新時間:2026年02月09日 09:35:13   作者:思靜魚  
本文主要介紹了Java中FutureTask 和 CompletableFuture的區(qū)別嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

FutureTask 和 CompletableFuture 雖然都用于異步編程,但它們在設計理念、功能性和適用場景上有著天壤之別。

可以將 FutureTask 視為一把手動扳手,功能單一但可靠;而 CompletableFuture 則是一個智能電動工具套裝,功能強大且自動化程度高。

以下是它們的詳細區(qū)別,我用一個表格進行概括,然后深入解釋:

一、核心區(qū)別對比表

特性FutureTaskCompletableFuture
設計理念一個任務的包裝器一個異步計算的流水線/階段(Stage)
繼承體系實現 Runnable 和 Future實現 Future 和 CompletionStage
結果獲取阻塞式 (get())阻塞式 (get()) + 非阻塞回調 (thenXXX)
組合能力無。需手動編排多個Future極其強大。thenCompose, thenCombine, allOf, anyOf
異常處理get() 時拋出 ExecutionException流式處理 (exceptionally, handle)
手動完成困難,需通過子類覆蓋等技巧內置 (complete, completeExceptionally)
狀態(tài)轉換內部復雜狀態(tài)機(NEW, COMPLETING, NORMAL…)更高級的抽象,對開發(fā)者更透明
依賴關系無內置支持有,后續(xù)階段自動依賴前序階段的完成
適用場景簡單的、一次性的異步任務執(zhí)行復雜的、需要鏈式調用和組合的全鏈路異步化
類比手動扳手 - 功能單一可靠智能電動工具套裝 - 功能強大自動化

二、深入解析關鍵區(qū)別

1. 核心設計理念:任務 (Task) vs. 階段 (Stage)

這是最根本的區(qū)別。

  • FutureTask: 它的核心是包裝一個任務(Callable 或 Runnable)。你創(chuàng)建一個 FutureTask 對象,把它丟給一個線程去執(zhí)行,然后它代表那個單一任務的執(zhí)行結果。它的關注點是“執(zhí)行”這個動作本身。
  • CompletableFuture: 它的核心是代表一個異步計算的階段。它源自 CompletionStage 接口。你不需要關心這個階段背后的任務是如何被執(zhí)行的(可能是線程池,也可能是其他方式)。你更關心的是這個階段完成后要做什么,以及它如何與其他階段連接起來。它的關注點是“組合與流轉”。

2. 結果獲取方式:阻塞 vs. 非阻塞回調

  • FutureTask:

    FutureTask<String> futureTask = new FutureTask<>(() -> "Result");
    new Thread(futureTask).start();
    
    // 你必須主動調用 get(),線程會在此阻塞直到結果可用
    String result = futureTask.get(); // <- 阻塞點!
    

    問題get() 方法是阻塞的,在等待結果時線程無法做其他事情,浪費資源。

  • CompletableFuture:

    CompletableFuture.supplyAsync(() -> "Result")
                     .thenAccept(result -> System.out.println("Got: " + result)); // 非阻塞回調
                     
    // 主線程可以立即繼續(xù)執(zhí)行,無需等待
    System.out.println("Main thread continues...");
    

    優(yōu)勢:通過 thenAccept, thenApply 等回調方法,注冊一個動作,當結果可用時自動執(zhí)行。調用線程不會被阻塞,極大地提高了系統(tǒng)的吞吐量。

3. 組合與鏈式編程:無能 vs. 強大

這是 CompletableFuture 碾壓性優(yōu)勢的地方。

  • FutureTask: 幾乎沒有組合能力。如果你想在任務A完成后,將其結果傳給任務B,你需要手動管理:

    FutureTask<String> taskA = ...;
    FutureTask<String> taskB = new FutureTask<>(() -> {
        String aResult = taskA.get(); // 這里會阻塞任務B的執(zhí)行線程!
        return process(aResult);
    });
    new Thread(taskB).start();
    

    這種方式既笨拙又會導致線程阻塞,無法高效利用資源。

  • CompletableFuture: 提供了一整套函數式的流式操作符。

    • thenCompose() (扁平化映射): 用于串聯兩個有依賴關系的異步任務。
      CompletableFuture<String> future = getUserAsync(id)
          .thenCompose(user -> getOrderAsync(user)); // 返回 CompletableFuture<String>
      
    • thenCombine() (合并結果): 合并兩個獨立異步任務的結果。
      CompletableFuture<Double> future = getPriceAsync()
          .thenCombine(getTaxRateAsync(), (price, rate) -> price * rate);
      
    • allOf() / anyOf(): 等待所有任務完成或任意一個任務完成。
      CompletableFuture<Void> all = CompletableFuture.allOf(future1, future2, future3);
      all.thenRun(() -> /* 所有任務都完成了 */);
      

4. 異常處理:粗暴 vs. 優(yōu)雅

  • FutureTask: 任務執(zhí)行中的異常會被捕獲,然后在調用 get() 時包裝成 ExecutionException 拋出。你只能在一個集中的地方進行 try-catch,處理邏輯不靈活。

    try {
        futureTask.get();
    } catch (ExecutionException e) {
        Throwable cause = e.getCause(); // 獲取真正的異常
        // 處理異常
    }
    
  • CompletableFuture: 提供了流式的異常處理機制,可以非常優(yōu)雅地在流水線的任何一步進行恢復或處理。

    • exceptionally(): 類似于 catch,提供降級結果。
      CompletableFuture.supplyAsync(() -> mightFail())
                       .exceptionally(ex -> "Default Value");
      
    • handle(): 類似于 finally,無論成功失敗都會執(zhí)行,并可轉換結果。
      .handle((result, ex) -> {
          if (ex != null) {
              return "Recovered from: " + ex.getMessage();
          }
          return result;
      });
      

三、總結與選擇建議

場景推薦選擇原因
簡單的、一次性的后臺任務FutureTask 或直接使用 ExecutorService.submit()足夠簡單,無需引入復雜的鏈式API。
需要手動控制任務執(zhí)行(如放入特定線程)FutureTask它本身是 Runnable,可以直接交給 Thread 執(zhí)行。
復雜的異步流水線(任務依賴、結果聚合、超時控制)CompletableFuture其強大的組合和異常處理能力是唯一選擇。
高并發(fā)、高吞吐量服務CompletableFuture非阻塞回調能最大限度利用線程資源,避免阻塞等待。
響應式編程/全鏈路異步CompletableFuture它是構建非阻塞應用的基礎,是現代Java異步編程的事實標準。

結論:FutureTask 是一個更底層、更基礎的構建塊,是 ExecutorService 框架的基石。而 CompletableFuture 是一個站在 FutureTask 等基礎組件之上的、更高級的、面向現代異步編程需求的API和編程模型。對于新項目,絕大多數情況下都應優(yōu)先使用 CompletableFuture。

到此這篇關于Java中FutureTask 和 CompletableFuture的區(qū)別的文章就介紹到這了,更多相關Java FutureTask 和 CompletableFuture內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java設計模式之單一職責原則精解

    Java設計模式之單一職責原則精解

    設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。設計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設計模式七大原則之一的單一職責原則
    2022-02-02
  • Java動態(tài)顯示文件上傳進度實現代碼

    Java動態(tài)顯示文件上傳進度實現代碼

    這篇文章主要為大家詳細介紹了Java動態(tài)顯示文件上傳進度實現代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java新特性之Nashorn_動力節(jié)點Java學院整理

    Java新特性之Nashorn_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java新特性之Nashorn的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java詳細分析String類與StringBuffer和StringBuilder的使用方法

    Java詳細分析String類與StringBuffer和StringBuilder的使用方法

    當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產生新的未使用對象
    2022-04-04
  • Java實現滑動窗口算法的示例代碼

    Java實現滑動窗口算法的示例代碼

    滑動窗口算法是一種高效解決子數組、子字符串問題的算法,廣泛應用于數據流處理、網絡限流和字符串操作等場景,本文將詳細解析滑動窗口算法的核心思想、常見問題及其實現方式,需要的朋友可以參考下
    2025-03-03
  • IDEA操作MongoDB及安全認證方式

    IDEA操作MongoDB及安全認證方式

    這篇文章主要介紹了IDEA操作MongoDB及安全認證方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 在Java的Spring框架的程序中使用JDBC API操作數據庫

    在Java的Spring框架的程序中使用JDBC API操作數據庫

    這篇文章主要介紹了在Java的Spring框架的程序中使用JDBC API操作數據庫的方法,并通過示例展示了其存儲過程以及基本SQL語句的應用,需要的朋友可以參考下
    2015-12-12
  • 從零到掌握Spring Boot Validation 接口校驗的詳細過程

    從零到掌握Spring Boot Validation 接口校驗的詳細過程

    本文詳細介紹了SpringBoot的Validation接口校驗機制,包括其核心功能、常用注解、自定義校驗、以及實際應用場景,通過注解定義數據校驗規(guī)則,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Java 中使用數組存儲和操作數據

    Java 中使用數組存儲和操作數據

    本文將介紹Java中常用的數組操作方法,通過詳細的示例和解釋,幫助讀者全面理解和掌握這些方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Eclipse maven項目lombok安裝配置圖解

    Eclipse maven項目lombok安裝配置圖解

    這篇文章主要介紹了Eclipse maven項目lombok安裝配置圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論

绥阳县| 武强县| 承德市| 汤原县| 涪陵区| 雅江县| 东方市| 靖西县| 珠海市| 孟州市| 扬中市| 阿鲁科尔沁旗| 宜黄县| 益阳市| 聊城市| 旌德县| 武宁县| 通渭县| 尼木县| 嘉兴市| 景东| 建始县| 高尔夫| 洛浦县| 绥芬河市| 承德市| 六安市| 西青区| 铜鼓县| 开远市| 永泰县| 伊川县| 个旧市| 循化| 云浮市| 麻江县| 精河县| 彰武县| 阳东县| 应城市| 乳山市|