什么是異步編程
在實(shí)現(xiàn)異步調(diào)用之前,我們先了解一下,什么是異步編程?什么場(chǎng)景下適用等等情況。
我們都知道,在傳統(tǒng)的同步編程中,當(dāng)一個(gè)操作開始執(zhí)行時(shí),程序會(huì)阻塞并等待該操作完成,然后才能繼續(xù)執(zhí)行后續(xù)代碼。這種阻塞等待的方式可能會(huì)導(dǎo)致程序響應(yīng)性能下降,因?yàn)樵诘却倪^(guò)程中無(wú)法同時(shí)處理其他任務(wù)。這種顯而易見的,在某種耗時(shí)的場(chǎng)景下,就顯得無(wú)用了,甚至很影響體驗(yàn)。
如文件讀寫、網(wǎng)絡(luò)請(qǐng)求或計(jì)算密集型任務(wù),再如人臉融合特效等等,都是耗時(shí)的操作,這個(gè)時(shí)候,我們就需要異步編程了。
異步編程則不會(huì)阻塞程序的執(zhí)行,它將耗時(shí)的操作提交給后臺(tái)線程或其他執(zhí)行環(huán)境,并立即返回,使得程序可以繼續(xù)執(zhí)行其他任務(wù)。當(dāng)耗時(shí)操作完成后,會(huì)通過(guò)回調(diào)、事件或者輪詢等方式通知主線程,主線程再去處理操作結(jié)果或執(zhí)行相應(yīng)的回調(diào)函數(shù)。
CompletableFuture
今天我們就來(lái)了解下 CompletableFuture
,它Java 8引入的一種功能強(qiáng)大的異步編程工具,可以用于實(shí)現(xiàn)復(fù)雜的異步操作和處理鏈?zhǔn)降漠惒饺蝿?wù)。
從這個(gè)JDK里,可以看出,它既實(shí)現(xiàn)了 Future
接口,擁有 Future 所有的特性,比如可以使用 get()
方法獲取返回值等。
也實(shí)現(xiàn)了CompletionStage
接口,提供了豐富的方法來(lái)管理異步任務(wù)的執(zhí)行和處理任務(wù)結(jié)果。并且這些接口多達(dá)40多個(gè),完全足夠我們?nèi)粘K褂昧恕?/p>
1. supplyAsync
1. CompletableFuture<T> supplyAsync(Supplier<? extends T> supplier)
該方法接受一個(gè)Supplier函數(shù)式接口作為參數(shù),用于執(zhí)行一個(gè)有返回值的異步任務(wù)。返回一個(gè)CompletableFuture
對(duì)象,可以用于獲取異步任務(wù)的執(zhí)行結(jié)果。
參數(shù):
Supplier
:一個(gè)無(wú)參的函數(shù)式接口,用于提供異步任務(wù)的結(jié)果。
2. runAsync
2、CompletableFuture<Void> runAsync(Runnable runnable)
該方法接受一個(gè)Runnable函數(shù)式接口作為參數(shù),用于執(zhí)行一個(gè)無(wú)返回值的異步任務(wù)。返回一個(gè)CompletableFuture
對(duì)象,可以用于等待異步任務(wù)完成。
參數(shù):Runnable
:一個(gè)無(wú)參的函數(shù)式接口,用于執(zhí)行異步任務(wù)。
3. thenApply
3、CompletableFuture<T> thenApply(Function<? super T,? extends U> function)
該方法接受一個(gè)Function函數(shù)式接口作為參數(shù),用于對(duì)CompletableFuture的結(jié)果進(jìn)行處理,并返回新的CompletableFuture對(duì)象。
參數(shù):Function
:一個(gè)帶有一個(gè)參數(shù)的函數(shù)式接口,用于對(duì)異步任務(wù)的結(jié)果進(jìn)行轉(zhuǎn)換或處理。
4. thenAccept
4、CompletableFuture<Void> thenAccept(Consumer<? super T> consumer)
該方法接受一個(gè)Consumer函數(shù)式接口作為參數(shù),用于對(duì)CompletableFuture
的結(jié)果進(jìn)行消費(fèi),沒有返回值。
參數(shù):
Consumer
:一個(gè)帶有一個(gè)參數(shù)的函數(shù)式接口,用于消費(fèi)異步任務(wù)的結(jié)果。
5. thenRun
5、CompletableFuture<Void> thenRun(Runnable action)
該方法接受一個(gè)Runnable函數(shù)式接口作為參數(shù),用于在CompletableFuture的結(jié)果完成后執(zhí)行指定的操作,沒有返回值。
參數(shù):BiFunction
:一個(gè)帶有兩個(gè)參數(shù)的函數(shù)式接口,用于合并兩個(gè)CompletableFuture的結(jié)果。
6. thenCombine
6、CompletableFuture<U> thenCombine(CompletionStage<? extends V> other, BiFunction<? super T,? super U,? extends V> fn)
該方法接受一個(gè)CompletionStage
對(duì)象和一個(gè)BiFunction
函數(shù)式接口作為參數(shù),用于等待當(dāng)前CompletableFuture
和另一個(gè)CompletionStage
對(duì)象都完成后,將其結(jié)果進(jìn)行組合處理,并返回新的CompletableFuture
對(duì)象。
參數(shù):
CompletionStage
:代表一個(gè)異步任務(wù)的執(zhí)行狀態(tài)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-610519.html
返回值:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-610519.html
-
CompletableFuture<T>
:表示一個(gè)異步任務(wù)的結(jié)果,可以通過(guò)該對(duì)象獲取異步任務(wù)的執(zhí)行結(jié)果。 -
CompletableFuture<Void>
:表示一個(gè)異步任務(wù)的結(jié)果,沒有返回值。
java 演示
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 使用supplyAsync方法創(chuàng)建一個(gè)CompletableFuture對(duì)象來(lái)執(zhí)行有返回值的異步任務(wù)
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("異步任務(wù)正在執(zhí)行");
return 100;
});
// 使用thenApply方法對(duì)異步任務(wù)的結(jié)果進(jìn)行處理,并返回新的CompletableFuture對(duì)象
CompletableFuture<String> processedFuture = future.thenApply(result -> {
System.out.println("對(duì)異步任務(wù)結(jié)果進(jìn)行處理");
return "處理后的結(jié)果:" + result * 2;
});
// 使用get方法阻塞當(dāng)前線程,并獲取異步任務(wù)的執(zhí)行結(jié)果
String result = processedFuture.get();
System.out.println(result);
}
}
異步任務(wù)正在執(zhí)行
對(duì)異步任務(wù)結(jié)果進(jìn)行處理
處理后的結(jié)果:200
到了這里,關(guān)于java 如何快速實(shí)現(xiàn)異步調(diào)用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!