完美掌握CompletableFuture.whenComplete()

一、CompletableFuture是什麼?

CompletableFuture是Java8新增的一個多線程編程類,它可以對非同步操作進行編排,提供了一種優雅的方式處理一組Future。

Future是Java5提供的一個介面,通常用來表示一個非同步計算的結果,當非同步計算結束時,我們可以通過Future獲取結果並繼續執行其他操作。

然而,Future的問題在於它是一個單向的數據流,只能提供結果而無法傳遞參數。而CompletableFuture則可以通過回調、組合等方式進行操作。

二、CompletableFuture.whenComplete()是什麼?

CompletableFuture.whenComplete()方法可以在Future完成後按照完成的結果執行一些操作,這些操作包括處理結果值、異常情況等。

whenComplete()方法接收一個BiConsumer參數,其中T表示Future的返回值類型,Throwable表示異常類型。當Future執行完成後,BiConsumer會被回調並傳遞兩個參數,分別是執行成功的結果或者執行時拋出的異常。

CompletableFuture completableFuture = new CompletableFuture();
completableFuture.complete(10);

completableFuture.whenComplete((i, e) -> {
    if (e == null) {
        System.out.println(i);
    } else {
        System.out.println(e.getMessage());
    }
});

代碼中,首先創建了一個CompletableFuture對象,然後通過complete()方法設置了返回值為10。隨後,使用whenComplete()方法對該對象進行後續處理。當Future執行完成後,如果沒有發生錯誤,則會調用第一個Lambda表達式進行處理,否則會調用第二個Lambda表達式進行處理。

三、為什麼要使用CompletableFuture.whenComplete()?

使用whenComplete()方法可以在Future執行完成後立即對其結果進行處理。在非同步計算完成後,可以直接對其結果進行操作,而無需等待其他操作的完成。

同時,在whenComplete()方法中,還可以處理Future執行過程中拋出的異常。在處理非同步計算的過程中,異常處理也同樣重要,通過whenComplete()方法提供的異常處理能夠更好地保障程序的穩定性。

四、whenComplete()方法的相關操作

1. 處理正常結果

當非同步計算正常執行完成時,可以通過第一個Lambda表達式對其結果進行處理。

CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> "hello");
completableFuture.whenComplete((s, throwable) -> {
    System.out.println(s);
});

代碼中,創建一個CompletableFuture對象,使用supplyAsync()方法開啟一個非同步任務。當任務執行完成後,通過whenComplete()方法處理其結果,將結果輸出到控制台。

2. 處理異常結果

在非同步計算執行過程中,有可能會出現異常情況。可以在whenComplete()方法中通過判斷Throwable參數是否為空來判斷非同步計算是否出現了異常。

CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("error");
});
completableFuture.whenComplete((s, throwable) -> {
    if (throwable == null) {
        System.out.println(s);
    } else {
        System.out.println(throwable.getMessage());
    }
});

代碼中,使用supplyAsync()方法開啟一個非同步任務,但是任務會拋出一個RuntimeException異常。當任務執行完成後,通過whenComplete()方法處理其異常結果,並將異常信息輸出到控制台。

3. 返回處理結果

使用whenComplete()方法可以對Future的執行結果進行處理,但是當需要返回處理結果時,可以使用thenApply()、thenApplyAsync()、thenCompose()等方法。

CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> "hello");
CompletableFuture future = completableFuture.whenComplete((s, throwable) -> {
    System.out.println(s);
}).thenApply(s -> s + "world");
System.out.println(future.join());

代碼中,創建一個CompletableFuture對象,使用supplyAsync()方法開啟一個非同步任務。當任務執行完成後,使用whenComplete()方法對其結果進行處理,並將結果拼接成一個新的字元串。最後通過join()方法獲取到處理結果並輸出到控制台。

4. 處理異常情況

使用whenComplete()方法可以處理非同步計算執行過程中出現的異常情況,在處理異常情況時,可以使用handle()方法進行替換,使得代碼更為簡潔。

CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException();
});
completableFuture.handle((s, throwable) -> {
    return s == null ? "error" : s;
}).thenAccept(System.out::println);

代碼中,創建一個CompletableFuture對象,任務會拋出一個RuntimeException異常。在處理完成後,使用handle()方法對異常情況進行處理,並將處理結果輸出到控制台。使用handle()方法後,可以直接對異常情況進行處理而不需要再進行判斷。

五、總結

CompletableFuture.whenComplete()方法是Java8中提供的一個多線程編程類,通過這個方法可以在非同步計算執行完成後對其結果進行處理,同時還可以處理異常情況。適當地使用whenComplete()方法可以更好地優化程序的運行效率和穩定性,與此同時也可以使代碼更加優雅簡潔。

原創文章,作者:DVKH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149033.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DVKH的頭像DVKH
上一篇 2024-11-04 17:50
下一篇 2024-11-04 17:50

相關推薦

發表回復

登錄後才能評論