SpringBoot中的CompletableFuture類詳解
CompletableFuture 類
Java 8 中的 CompletableFuture 類是一種用于異步編程的新機(jī)制。它提供了一種簡單而強(qiáng)大的方式來執(zhí)行異步任務(wù),并在任務(wù)完成時(shí)執(zhí)行回調(diào)函數(shù)。
CompletableFuture 類可以理解為一種 Promise 模式的實(shí)現(xiàn)。Promise 模式是一種編程模式,用于異步編程。它允許我們在異步任務(wù)完成之前繼續(xù)執(zhí)行其他任務(wù),然后在異步任務(wù)完成時(shí)執(zhí)行回調(diào)函數(shù)。
CompletableFuture 類提供了一組方法,用于創(chuàng)建和組合異步任務(wù)。這些方法包括 thenApply、thenAccept、thenRun、thenCombine、thenCompose 等等。
在 Spring Boot 中,我們可以使用 CompletableFuture 類來執(zhí)行異步任務(wù)。下面是一個(gè)簡單的例子:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello, world!"; }); future.thenAccept(result -> System.out.println(result));
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,它表示一個(gè)異步任務(wù)。異步任務(wù)使用 supplyAsync 方法創(chuàng)建,該方法接受一個(gè) Supplier 接口作為參數(shù)。在這個(gè)例子中,我們使用 lambda 表達(dá)式實(shí)現(xiàn)了 Supplier 接口,返回一個(gè)字符串 “Hello, world!”。
然后,我們使用 thenAccept 方法注冊一個(gè)回調(diào)函數(shù),當(dāng)異步任務(wù)完成時(shí)執(zhí)行該回調(diào)函數(shù)。在這個(gè)例子中,我們簡單地將結(jié)果打印到控制臺(tái)上。
如何使用 CompletableFuture 類
要使用 CompletableFuture 類,請按照以下步驟操作:
第 1 步:創(chuàng)建異步任務(wù)
使用 CompletableFuture.supplyAsync 方法創(chuàng)建異步任務(wù)。supplyAsync 方法接受一個(gè) Supplier 接口作為參數(shù)。在 Supplier 接口的實(shí)現(xiàn)中,實(shí)現(xiàn)異步任務(wù)的邏輯。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // Execute asynchronous task return "Hello, world!"; });
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,表示一個(gè)異步任務(wù)。異步任務(wù)使用 supplyAsync 方法創(chuàng)建,該方法接受一個(gè) Supplier 接口作為參數(shù)。在 Supplier 接口的實(shí)現(xiàn)中,實(shí)現(xiàn)異步任務(wù)的邏輯。
第 2 步:注冊回調(diào)函數(shù)
使用 thenAccept 方法注冊一個(gè)回調(diào)函數(shù),當(dāng)異步任務(wù)完成時(shí)執(zhí)行該回調(diào)函數(shù)。
future.thenAccept(result -> System.out.println(result));
在上面的代碼中,我們使用 thenAccept 方法注冊一個(gè)回調(diào)函數(shù),當(dāng)異步任務(wù)完成時(shí)執(zhí)行該回調(diào)函數(shù)。在這個(gè)例子中,我們簡單地將結(jié)果打印到控制臺(tái)上。
第 3 步:等待異步任務(wù)完成
如果需要等待異步任務(wù)完成,可以使用 get 方法阻塞當(dāng)前線程,直到異步任務(wù)完成。
String result = future.get();
在上面的代碼中,我們使用 get 方法獲取異步任務(wù)的結(jié)果。如果異步任務(wù)尚未完成,get 方法將阻塞當(dāng)前線程,直到異步任務(wù)完成。
CompletableFuture 類的高級用法
CompletableFuture 類還提供了許多高級用法,可以用于組合和轉(zhuǎn)換異步任務(wù)。以下是一些常用的方法:
thenApply
使用 thenApply 方法將一個(gè) CompletableFuture 對象轉(zhuǎn)換為另一個(gè) CompletableFuture 對象。
thenApply 方法接受一個(gè) Function 接口作為參數(shù),該接口將接受上一個(gè) CompletableFuture 對象的結(jié)果作為輸入,并返回一個(gè)新的 CompletableFuture 對象的結(jié)果。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello") .thenApply(result -> result + " world");
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,表示一個(gè)異步任務(wù)。我們使用 thenApply 方法將其轉(zhuǎn)換為另一個(gè) CompletableFuture 對象。在 thenApply 方法的實(shí)現(xiàn)中,我們將原始 CompletableFuture 對象的結(jié)果連接到字符串 " world" 上,然后返回一個(gè)新的 CompletableFuture 對象。
thenAccept
使用 thenAccept 方法注冊一個(gè)回調(diào)函數(shù),在異步任務(wù)完成時(shí)執(zhí)行該回調(diào)函數(shù)。與上面的例子類似,但是不返回結(jié)果。
CompletableFuture.supplyAsync(() -> "Hello") .thenAccept(result -> System.out.println(result));
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,表示一個(gè)異步任務(wù)。我們使用 thenAccept 方法注冊一個(gè)回調(diào)函數(shù),在異步任務(wù)完成時(shí)打印結(jié)果到控制臺(tái)上。
thenRun
使用 thenRun 方法注冊一個(gè)回調(diào)函數(shù),在異步任務(wù)完成時(shí)執(zhí)行該回調(diào)函數(shù)。與上面的例子類似,但是不接受任何參數(shù)。
CompletableFuture.supplyAsync(() -> "Hello") .thenRun(() -> System.out.println("Task completed"));
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,表示一個(gè)異步任務(wù)。我們使用 thenRun 方法注冊一個(gè)回調(diào)函數(shù),在異步任務(wù)完成時(shí)打印消息到控制臺(tái)上。
thenCombine
使用 thenCombine 方法組合兩個(gè) CompletableFuture 對象的結(jié)果,返回一個(gè)新的 CompletableFuture 對象。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello"); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> " world"); CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);
在上面的代碼中,我們創(chuàng)建了兩個(gè) CompletableFuture 對象,分別表示兩個(gè)異步任務(wù)。然后,我們使用 thenCombine 方法將這兩個(gè) CompletableFuture 對象組合起來,返回一個(gè)新的 CompletableFuture 對象。在 thenCombine 方法的實(shí)現(xiàn)中,我們將兩個(gè) CompletableFuture 對象的結(jié)果連接起來,然后返回一個(gè)新的 CompletableFuture 對象。
thenCompose
使用 thenCompose 方法將一個(gè) CompletableFuture 對象轉(zhuǎn)換為另一個(gè) CompletableFuture 對象。與 thenApply 方法類似,但是 thenCompose 方法接受一個(gè) Function 接口作為參數(shù),該接口將返回一個(gè)新的 CompletableFuture 對象。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello"); CompletableFuture<String> future2 = future1.thenCompose(result -> CompletableFuture.supplyAsync(() -> result + " world"));
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,表示一個(gè)異步任務(wù)。然后,我們使用 thenCompose 方法將其轉(zhuǎn)換為另一個(gè) CompletableFuture 對象。在 thenCompose 方法的實(shí)現(xiàn)中,我們使用原始 CompletableFuture 對象的結(jié)果創(chuàng)建一個(gè)新的 CompletableFuture 對象,并將其返回。
異常處理
在異步編程中,異常處理是一個(gè)常見的問題。CompletableFuture 類提供了一種簡單而強(qiáng)大的方式來處理異常。
異常處理方法
在 CompletableFuture 類中,我們可以使用 exceptionally 方法來處理異步任務(wù)的異常。exceptionally 方法接受一個(gè) Function 接口作為參數(shù),該接口將接受一個(gè) Throwable 對象作為輸入,并返回一個(gè)新的 CompletableFuture 對象的結(jié)果。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("Exception occurred"); }).exceptionally(ex -> "Handled exception: " + ex.getMessage());
在上面的代碼中,我們創(chuàng)建了一個(gè) CompletableFuture 對象,表示一個(gè)異步任務(wù)。我們使用 supplyAsync 方法創(chuàng)建異步任務(wù),該任務(wù)總是會(huì)拋出 RuntimeException 異常。然后,我們使用 exceptionally 方法處理異常,并返回一個(gè)包含錯(cuò)誤消息的 CompletableFuture 對象。
多個(gè) CompletableFuture 異常處理
如果在多個(gè) CompletableFuture 中發(fā)生異常,我們可以使用 handle 方法處理異常。handle 方法接受一個(gè) BiFunction 接口作為參數(shù),該接口將接受兩個(gè)參數(shù):異步任務(wù)的結(jié)果(如果成功完成)或異常(如果發(fā)生異常),以及一個(gè) Throwable 對象(如果發(fā)生異常)。
CompletableFuture<String> future1 = CompletableFuture.sup
到此這篇關(guān)于SpringBoot中的CompletableFuture類詳解的文章就介紹到這了,更多相關(guān)CompletableFuture類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成ActiveMQ的實(shí)戰(zhàn)全過程
消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合、異步消息、流量削鋒等問題,實(shí)現(xiàn)高性能、高可用、可伸縮和最終一致性架構(gòu),是大型分布式系統(tǒng)不可缺少的中間件,這篇文章主要給大家介紹了關(guān)于SpringBoot集成ActiveMQ的相關(guān)資料,需要的朋友可以參考下2021-11-11Java實(shí)現(xiàn)轉(zhuǎn)換圖片格式的示例代碼
在日常的軟件開發(fā)中,處理圖像文件是一項(xiàng)常見任務(wù),這篇文章將實(shí)現(xiàn)實(shí)現(xiàn)一個(gè)簡單的Java程序,用于將一種圖片格式轉(zhuǎn)換為另一種格式,需要的可以了解下2025-02-02Java判斷中英文符號、標(biāo)點(diǎn)的實(shí)現(xiàn)
本篇文章主要介紹了Java判斷中英文符號、標(biāo)點(diǎn)的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10java 刪除數(shù)組元素與刪除重復(fù)數(shù)組元素的代碼
在java中刪除數(shù)組元素與過濾重復(fù)數(shù)組元素我們都會(huì)需要去遍歷數(shù)組然后根據(jù)我們設(shè)置的值或方法進(jìn)行去除數(shù)組2013-10-10SpringBoot操作MaxComputer方式(保姆級教程)
這篇文章主要介紹了SpringBoot操作MaxComputer方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03JavaWeb項(xiàng)目實(shí)戰(zhàn)之表白墻和在線相冊
這篇文章主要給大家介紹了關(guān)于JavaWeb項(xiàng)目實(shí)戰(zhàn)之表白墻和在線相冊的相關(guān)資料,JavaWeb表白墻是一款基于JavaWeb技術(shù)開發(fā)的表白墻應(yīng)用,用戶可以在上面發(fā)布表白信息,也可以查看其他用戶的表白信息,需要的朋友可以參考下2023-03-03詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐
在 Web 開發(fā)中, 我們經(jīng)常會(huì)需要處理各種異常,這篇文章主要介紹了詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01