一、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