本週我學習了:CompletableFuture – Java 的非同步程式設計方法
本週,我將深入研究 Java 的 CompletableFuture。
身為一名有前端背景的全端開發人員,處理非同步任務是我角色中不可避免的一部分——網路請求、後台運算等。在 Java 中,CompletableFuture 是一個強大的工具,用於處理這些任務,同時保持主執行緒回應。
Completable futures 之於 Java 就像 Promises 之於 JavaScript。
如果您熟悉 JavaScript,透過比較兩種語言可能有助於掌握這些概念。我喜歡將 CompletableFuture 視為 Java 版本的 Promise。它是一個表示非同步操作的最終結果的類,無論該結果是成功還是失敗。它作為 java.util.concurrent 套件的一部分在 Java 8 中引入,是一種編寫非阻塞程式碼的強大方法,具有連結操作和處理錯誤的方法,與 Promises 類似。
這是兩者的快速比較:
// JavaScript Promise fetchFromServer() .then(data => processData(data)) .then(result => updateUI(result)) .catch(error => handleError(error));
// Java CompletableFuture CompletableFuture.supplyAsync(() -> fetchDataFromServer()) .thenApply(data -> processData(data)) .thenAccept(result -> updateUI(result)) .exceptionally(error -> handleError(error));
如上所示,CompletableFuture 提供了類似的可連結語法,允許乾淨且可讀的非同步程式碼。
考慮一個場景,您需要從兩個單獨的端點取得使用者的個人資料資料和訂單歷史記錄。您可能希望避免在等待這些請求完成時凍結 UI。以下是使用 CompletableFuture 實現此功能的方法:
CompletableFuture<User> profileFuture = CompletableFuture.supplyAsync(() -> { // Fetch user profile from a service }); CompletableFuture<List<Order>> ordersFuture = CompletableFuture.supplyAsync(() -> { // Fetch user orders from another service }); CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(profileFuture, ordersFuture); combinedFuture.thenRun(() -> { User user = userFuture.join(); List<Order> orders = ordersFuture.join(); displayUserData(user, orders); });
在此範例中,我們同時觸發兩個非同步請求,並使用 allOf 等待兩個請求完成。一旦完成,我們就會檢索結果並相應地更新 UI,所有這些都不會阻塞主執行緒。
連結和完成階段
CompletableFuture 實作了 CompletionStage 接口,為鍊式運算提供了基礎。每個 thenApply、thenAccept 和類似方法都會傳回另一個 CompletionStage,讓您可以建立複雜的非同步管道。
類似於當我們要依次執行一系列非同步任務時如何在 JavaScript 中連結 Promise,我們可以在 Completable Future 中連結任務,以便創建一系列依賴的非同步操作,而不會陷入回調地獄。我們的做法如下:
CompletableFuture.supplyAsync(() -> "Hello") .thenApply(result -> result + ", CompletableFuture") .thenApply(result -> result + " in Java") .thenAccept(System.out::println);
處理例外
當我們在 Promise 物件上使用 .catch() 時,我們在 Completable Future 上使用 .exceptionally() 。此方法處理非同步處理過程中可能出現的異常:
CompletableFuture.supplyAsync(() -> { if (true) { throw new RuntimeException("Exception in CompletableFuture!"); } return "No exception"; }).exceptionally(ex -> { System.out.println("Handled exception: " + ex); return "Recovered value"; }).thenAccept(System.out::println);
我希望這篇文章為您提供一個很好的起點來進一步探索 CompletableFuture 類別。
有用連結:
- 並發深度探究:CompletableFuture 指南
- Java 非同步程式設計綜合介紹 - Promise、Callbacks 和 Futures
以上是本週我學習了:CompletableFuture – Java 的非同步程式設計方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...
