java中CompleteFuture與Future的區(qū)別小結(jié)
CompleteFuture的介紹
CompletableFuture是Java 8提供的一種基于Future的異步編程的實(shí)現(xiàn)。它不僅可以代表異步計(jì)算的結(jié)果,還能夠定義它完成之后的回調(diào)函數(shù)。它的實(shí)現(xiàn)在java.util.concurrent.CompletableFuture的包內(nèi)。
CompletableFuture的實(shí)現(xiàn)涉及到JDK 8的幾個(gè)新特性,如Lambda、Stream、線程池等,它允許把任務(wù)池、線程池和阻塞隊(duì)列組合在一起,使得開發(fā)者可以更加簡(jiǎn)單地實(shí)現(xiàn)異步編程,對(duì)程序的執(zhí)行性能也帶來了一定的提升。
與Future相比,CompletableFuture的優(yōu)勢(shì)在于:
- 可以直接對(duì)多個(gè)任務(wù)進(jìn)行鏈?zhǔn)?、組合等處理,而不需要借助并發(fā)工具類。
- 實(shí)現(xiàn)了對(duì)任務(wù)編排的能力,可以輕松地組織不同任務(wù)的運(yùn)行順序、規(guī)則以及方式。
CompleteFuture的特點(diǎn)
CompletableFuture的特點(diǎn)主要包括異步執(zhí)行、鏈?zhǔn)讲僮骱挽`活性強(qiáng)。
- 異步執(zhí)行:CompletableFuture允許任務(wù)在后臺(tái)線程中異步執(zhí)行,不會(huì)阻塞主線程,提高了應(yīng)用程序的響應(yīng)性和性能。
- 鏈?zhǔn)讲僮鳎篊ompletableFuture支持鏈?zhǔn)讲僮?,可以方便地處理任?wù)的依賴關(guān)系和結(jié)果轉(zhuǎn)換。
- 靈活性強(qiáng):相比于傳統(tǒng)的Future接口,CompletableFuture更加靈活和強(qiáng)大,提供了豐富的方法來處理異步操作和多個(gè)任務(wù)的結(jié)果。
CompleteFuture的應(yīng)用場(chǎng)景
CompletableFuture的應(yīng)用場(chǎng)景主要包括異步編程、任務(wù)組合和并發(fā)編程。
- 異步編程:在需要執(zhí)行耗時(shí)操作的情況下,使用CompletableFuture可以實(shí)現(xiàn)異步執(zhí)行,避免阻塞主線程,提高程序的響應(yīng)性和性能。
- 任務(wù)組合:CompletableFuture支持鏈?zhǔn)讲僮?,可以將多個(gè)異步任務(wù)組合在一起,按照指定的順序和邏輯執(zhí)行,實(shí)現(xiàn)任務(wù)的依賴關(guān)系和結(jié)果轉(zhuǎn)換。
- 并發(fā)編程:在多線程環(huán)境下,CompletableFuture可以方便地處理多個(gè)任務(wù)的結(jié)果,避免線程間的競(jìng)爭(zhēng)和同步問題,提高并發(fā)編程的效率和可靠性。
CompletableFuture的優(yōu)缺點(diǎn)
CompletableFuture的優(yōu)點(diǎn)主要包括簡(jiǎn)潔易用、支持異步編程、任務(wù)組合和并發(fā)編程等。它提供了一種簡(jiǎn)潔的方式來處理異步計(jì)算和任務(wù)組合,使得異步編程更加容易和高效。
然而,CompletableFuture也存在一些缺點(diǎn),例如:
- 無法對(duì)多個(gè)任務(wù)進(jìn)行鏈?zhǔn)秸{(diào)用:如果希望在計(jì)算任務(wù)完成后執(zhí)行特定動(dòng)作,比如發(fā)郵件,但CompletableFuture卻沒有提供這樣的能力。
- 無法組合多個(gè)任務(wù):如果運(yùn)行了10個(gè)任務(wù),并期望在它們?nèi)繄?zhí)行結(jié)束后執(zhí)行特定動(dòng)作,那么在CompletableFuture中這是無能為力的。
- 沒有異常處理:CompletableFuture接口中沒有關(guān)于異常處理的方法。
Future的介紹
Future是Java中用于異步計(jì)算的一個(gè)接口。它提供了一種方式,允許將一個(gè)耗時(shí)的計(jì)算任務(wù)放到另一個(gè)線程中執(zhí)行,而主線程可以繼續(xù)處理其他任務(wù)。
在Future接口中,通常包含一些方法,如isDone()、get()、cancel()等。isDone()方法用于檢查Future是否已經(jīng)完成,get()方法用于獲取Future的結(jié)果,cancel()方法用于取消Future的計(jì)算任務(wù)。
使用Future接口可以實(shí)現(xiàn)異步計(jì)算,提高程序的執(zhí)行效率。當(dāng)需要執(zhí)行一個(gè)耗時(shí)的計(jì)算任務(wù)時(shí),可以創(chuàng)建一個(gè)Future對(duì)象,然后將該對(duì)象傳遞給異步線程執(zhí)行。異步線程執(zhí)行完成后,可以通過Future對(duì)象獲取計(jì)算結(jié)果。
Future的特點(diǎn)
Future的特點(diǎn)主要有以下幾個(gè)方面:
- 表示異步操作未完成時(shí)的狀態(tài):Future對(duì)象可以表示一個(gè)異步操作是否完成,如果異步操作未完成,F(xiàn)uture對(duì)象的狀態(tài)為未完成,如果異步操作完成,F(xiàn)uture對(duì)象的狀態(tài)為已完成。
- 可以用來獲取異步操作完成后返回的結(jié)果:通過Future對(duì)象提供的get方法,可以獲取異步操作完成后返回的結(jié)果。
- 不提供直接的方式來添加回調(diào)函數(shù):Future不提供一種直接的方式來添加回調(diào)函數(shù),處理操作完成后的結(jié)果或異常。
- 只能表示異步任務(wù)是否完成,而不能手動(dòng)觸發(fā)任務(wù)的完成或組合多個(gè)任務(wù):Future只能表示異步任務(wù)是否完成,而不能手動(dòng)觸發(fā)任務(wù)的完成或組合多個(gè)任務(wù)。
Future的應(yīng)用場(chǎng)景
Future的應(yīng)用場(chǎng)景主要在并發(fā)編程中,當(dāng)我們需要用到非阻塞的模型時(shí),F(xiàn)uture就顯得尤為重要。
在Java多線程的三種實(shí)現(xiàn)中,無論是繼承Thread類還是實(shí)現(xiàn)Runnable接口,都是異步的,并且主調(diào)函數(shù)無法獲取到返回值。而Future則可以接收多線程的執(zhí)行結(jié)果。具體來說,F(xiàn)uture接收一個(gè)可能還沒有完成的異步任務(wù)的結(jié)果,針對(duì)這個(gè)結(jié)果可以添加Callable以便任務(wù)執(zhí)行成功或失敗后作出相應(yīng)的操作。
采用Future修改的異步方法,在每次被異步調(diào)用以后會(huì)馬上返回(無論異步方法體是否執(zhí)行完成),F(xiàn)uture就會(huì)監(jiān)聽異步任務(wù)執(zhí)行狀態(tài)(成功、失?。鹊綀?zhí)行完成以后,就能通過Future.get()方法獲取到異步返回的結(jié)果。也就是說,如果批量調(diào)用采用Future修飾的異步方法,程序不會(huì)阻塞等待,然后再遍歷Future列表,即可獲取到所有的異步結(jié)果(Future的內(nèi)部機(jī)制是等所有的異步任務(wù)完成了才進(jìn)行遍歷)。這種請(qǐng)求耗時(shí)只會(huì)略大于耗時(shí)最長(zhǎng)的一個(gè)Future修飾的方法。
Future的優(yōu)缺點(diǎn)
Future的優(yōu)點(diǎn)主要包括:
- 異步處理:Future允許將耗時(shí)的計(jì)算任務(wù)放到另一個(gè)線程中執(zhí)行,不會(huì)阻塞主線程,提高了程序的執(zhí)行效率。
- 鏈?zhǔn)讲僮?/strong>:Future支持鏈?zhǔn)讲僮鳎梢苑奖愕靥幚砣蝿?wù)的依賴關(guān)系和結(jié)果轉(zhuǎn)換。
然而,F(xiàn)uture也存在一些缺點(diǎn):
- 阻塞獲取結(jié)果:當(dāng)需要獲取Future的結(jié)果時(shí),如果計(jì)算還沒有完成,會(huì)導(dǎo)致程序阻塞。這可能會(huì)影響程序的性能和響應(yīng)性。
- 無法添加回調(diào)函數(shù):Future不提供一種直接的方式來添加回調(diào)函數(shù),處理操作完成后的結(jié)果或異常。這使得在異步操作完成后,無法直接進(jìn)行特定的處理。
CompletableFuture和Future的區(qū)別
CompletableFuture和Future的區(qū)別主要體現(xiàn)在以下幾個(gè)方面:
- 功能區(qū)別 :Future只能用于獲取異步計(jì)算的結(jié)果,而CompletableFuture除了能獲取異步計(jì)算的結(jié)果外,還可以用于組合多個(gè)異步任務(wù),處理異常情況,以及在任務(wù)完成時(shí)執(zhí)行回調(diào)函數(shù)等。
- 阻塞區(qū)別 :Future的get方法是阻塞的,如果異步計(jì)算沒有完成,它會(huì)一直等待直到計(jì)算完成。而CompletableFuture的get方法也是阻塞的,但是它可以設(shè)置超時(shí)時(shí)間,如果在指定的時(shí)間內(nèi)計(jì)算沒有完成,它會(huì)拋出TimeoutException異常。
- 異常處理區(qū)別 :Future的異常處理比較麻煩,需要在任務(wù)執(zhí)行時(shí)捕獲異常,然后將異常封裝到Future對(duì)象中返回。而CompletableFuture的異常處理比較簡(jiǎn)單,可以使用exceptionally方法或handle方法來處理異常情況。
- 組合任務(wù)區(qū)別 :Future不支持組合多個(gè)異步任務(wù),需要使用ExecutorService的submit方法來提交多個(gè)任務(wù),并使用Future對(duì)象來獲取每個(gè)任務(wù)的結(jié)果。而CompletableFuture支持組合多個(gè)異步任務(wù),可以使用thenCompose、thenCombine、thenAcceptBoth等方法來組合多個(gè)任務(wù)。
CompletableFuture和Future的關(guān)聯(lián)關(guān)系
CompletableFuture和Future之間存在關(guān)聯(lián)關(guān)系,因?yàn)镃ompletableFuture實(shí)現(xiàn)了Future接口。這意味著CompletableFuture可以作為Future使用,同時(shí)它還提供了更多功能,如鏈?zhǔn)讲僮?、異常處理和組合任務(wù)等。
CompletableFuture在內(nèi)部使用了一個(gè)子線程來執(zhí)行任務(wù),并且提供了異步計(jì)算的結(jié)果。當(dāng)異步計(jì)算完成時(shí),CompletableFuture會(huì)自動(dòng)將結(jié)果設(shè)置為已完成狀態(tài),并且可以通過get方法獲取結(jié)果。
與Future相比,CompletableFuture提供了更多的功能和靈活性。它支持鏈?zhǔn)讲僮?,可以將多個(gè)異步任務(wù)組合在一起,并且可以在任務(wù)完成后執(zhí)行特定的回調(diào)函數(shù)。此外,CompletableFuture還提供了異常處理機(jī)制,可以捕獲和處理任務(wù)執(zhí)行過程中拋出的異常。
因此,CompletableFuture是Future的擴(kuò)展和增強(qiáng),它提供了更多的功能和靈活性,適用于需要處理異步計(jì)算和組合多個(gè)任務(wù)的場(chǎng)景。
CompletableFuture和Future的使用示例
CompletableFuture使用示例
以下是一個(gè)使用CompletableFuture的示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模擬耗時(shí)操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, World!";
});
// 獲取異步計(jì)算的結(jié)果
String result = future.get();
System.out.println(result);
}
}
在這個(gè)示例中,我們使用CompletableFuture的supplyAsync方法創(chuàng)建了一個(gè)異步任務(wù),該任務(wù)會(huì)返回一個(gè)字符串"Hello, World!"。然后,我們使用get方法獲取異步計(jì)算的結(jié)果,并將其打印出來。這個(gè)示例演示了如何使用CompletableFuture來執(zhí)行異步計(jì)算并獲取結(jié)果。
Future使用示例
以下是一個(gè)使用Java Future的示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FutureExample {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
// 提交任務(wù)并獲取Future對(duì)象
Future<String> future = executor.submit(() -> {
// 模擬耗時(shí)操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, World!";
});
// 獲取異步計(jì)算的結(jié)果
String result = future.get();
System.out.println(result);
// 關(guān)閉ExecutorService
executor.shutdown();
}
}
在這個(gè)示例中,我們使用ExecutorService的submit方法提交了一個(gè)異步任務(wù),該任務(wù)會(huì)返回一個(gè)字符串"Hello, World!"。然后,我們使用Future的get方法獲取異步計(jì)算的結(jié)果,并將其打印出來。最后,我們關(guān)閉了ExecutorService以釋放資源。這個(gè)示例演示了如何使用Java Future來執(zhí)行異步計(jì)算并獲取結(jié)果。
CompletableFuture應(yīng)用步驟
在項(xiàng)目中使用CompletableFuture,可以按照以下步驟進(jìn)行:
- 導(dǎo)入CompletableFuture類:首先,需要在項(xiàng)目中導(dǎo)入CompletableFuture類,以便使用其功能。
- 創(chuàng)建異步任務(wù):使用CompletableFuture的靜態(tài)方法supplyAsync或runAsync來創(chuàng)建異步任務(wù)。supplyAsync方法接受一個(gè)Supplier接口的實(shí)現(xiàn)類作為參數(shù),用于定義異步任務(wù)的邏輯。runAsync方法接受一個(gè)Runnable接口的實(shí)現(xiàn)類作為參數(shù),用于定義異步任務(wù)的邏輯。
- 鏈?zhǔn)讲僮鳎菏褂肅ompletableFuture的thenApply、thenAccept、thenRun等方法來鏈?zhǔn)讲僮鳟惒饺蝿?wù)。這些方法接受一個(gè)Function、Consumer或Runnable接口的實(shí)現(xiàn)類作為參數(shù),用于定義鏈?zhǔn)讲僮鞯倪壿嫛?/li>
- 異常處理:使用CompletableFuture的exceptionally方法來處理異步任務(wù)中拋出的異常。exceptionally方法接受一個(gè)Function接口的實(shí)現(xiàn)類作為參數(shù),用于定義異常處理的邏輯。
- 獲取結(jié)果:使用CompletableFuture的get方法來獲取異步計(jì)算的結(jié)果。get方法會(huì)阻塞當(dāng)前線程,直到異步計(jì)算完成并返回結(jié)果。
以下是一個(gè)簡(jiǎn)單的示例代碼,演示了如何在項(xiàng)目中使用CompletableFuture:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模擬耗時(shí)操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, World!";
}).thenApply(result -> {
// 鏈?zhǔn)讲僮鳎簩?duì)結(jié)果進(jìn)行處理
return result.toUpperCase();
}).thenAccept(result -> {
// 鏈?zhǔn)讲僮鳎簩?duì)結(jié)果進(jìn)行處理并輸出到控制臺(tái)
System.out.println(result);
});
// 獲取異步計(jì)算的結(jié)果(如果需要)
future.get();
}
}
在上面的示例中,我們首先使用CompletableFuture的supplyAsync方法創(chuàng)建了一個(gè)異步任務(wù),該任務(wù)會(huì)返回一個(gè)字符串"Hello, World!"。然后,我們使用thenApply方法對(duì)結(jié)果進(jìn)行鏈?zhǔn)讲僮?,將結(jié)果轉(zhuǎn)換為大寫字母。接著,我們使用thenAccept方法對(duì)結(jié)果進(jìn)行鏈?zhǔn)讲僮鳎瑢⒔Y(jié)果輸出到控制臺(tái)。最后,我們使用get方法獲取異步計(jì)算的結(jié)果(如果需要)。
到此這篇關(guān)于java中CompleteFuture與Future的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)java CompleteFuture與Future內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
圖解Spring框架的設(shè)計(jì)理念與設(shè)計(jì)模式
這篇文章主要通過多圖詳細(xì)解釋Spring框架的設(shè)計(jì)理念與設(shè)計(jì)模式,需要的朋友可以參考下2015-08-08
java使用Runtime.getRuntime().exec調(diào)用外部程序
Runtime.getRuntime().exec一般用于調(diào)用外部可執(zhí)行程序或系統(tǒng)命令,并重定向外部程序的標(biāo)準(zhǔn)輸入,準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤到緩沖池,下面我們來看看Java如何使用它進(jìn)行調(diào)用外部程序吧2025-06-06
Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn)配置過程
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn),需要的朋友可以參考下2022-06-06
解決SpringBoot webSocket 資源無法加載、tomcat啟動(dòng)報(bào)錯(cuò)的問題
這篇文章主要介紹了解決SpringBoot webSocket 資源無法加載、tomcat啟動(dòng)報(bào)錯(cuò)的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

