在 Java 中使用 CompletableFuture 實作非同步並發程式設計:建立 CompletableFuture:透過 CompletableFuture.supplyAsync() 建立一個 CompletableFuture,它接收一個無參數方法作為參數,並傳回一個值。處理完成情況:使用 whenComplete()、thenApply()、thenAccept()、exceptionally() 和 handle() 方法處理任務的完成、例外和取消的情況。組合 CompletableFuture:使用 thenCompose() 方法將兩個 CompletableFuture 鍊式連接起來。實戰案例:展示如何使用 CompletableFuture 並行從資料庫取得使用者列表,並從遠端 API 取得每個使用者的詳細資訊。
如何在 Java 中使用 CompletableFuture 實作非同步並發程式設計?
簡介
CompletableFuture 是 Java 8 中引入的並發工具類,它允許您非同步執行任務並處理它們的完成情況。與傳統的線程相比,它提供了更優雅和簡化的方式來管理並發性。
基本用法
要建立一個 CompletableFuture,可以使用 CompletableFuture.supplyAsync() 方法,它接受一個 Supplier 作為參數。 Supplier 是一個沒有參數的方法,傳回一個值。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
處理完成情況
CompletableFuture 的主要功能之一是能夠處理任務的完成情況。它提供了多種方法來處理完成、異常和取消的情況:
whenComplete()
:在任務完成後執行指定的動作,無論是否完成成功。 thenApply()
:在任務成功完成後執行指定的函數並傳回一個新值。 thenAccept()
:在任務成功完成後執行指定的消費者。 exceptionally()
:在任務失敗後執行指定的例外處理程序並傳回一個新值。 handle()
:在任務完成後執行指定的函數,無論任務是否完成成功,並傳回一個新值。 組合 CompletableFuture
CompletableFuture 可以組合起來建立更複雜的平行任務。例如,您可以使用thenCompose()
方法將兩個CompletableFuture 鍊式連接起來:
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2); future1.thenCompose(x -> future2.thenApply(y -> x + y));
實戰案例
##假設我們有以下任務需要並行執行:CompletableFuture<List<User>> futureUsers = CompletableFuture.supplyAsync(() -> getUsersFromDatabase()); CompletableFuture<Map<Integer, UserDetail>> futureDetails = CompletableFuture.supplyAsync(() -> { List<User> users = futureUsers.get(); return getUsersDetailsFromApi(users); }); CompletableFuture<List<User>> combinedFuture = futureUsers.thenCombine(futureDetails, (users, details) -> { for (User user : users) { user.setDetails(details.get(user.getId())); } return users; });
這個範例展示如何使用CompletableFuture 並行取得來自不同來源的資料並組合它們。
以上是如何在 Java 中使用 CompletableFuture 實作非同步並發程式設計?的詳細內容。更多資訊請關注PHP中文網其他相關文章!