Java8 CompletableFuture 異步執(zhí)行操作
1.簡(jiǎn)介
CompletableFuture 是 JDK8 提供的一個(gè)異步執(zhí)行工具。
示例1:
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
Thread.sleep(1000L);
} catch (InterruptedException ignored) {
}
}
System.out.println("Future Finished.");
});
System.out.println("Main Thread Finished.");
future.get();
}
輸出結(jié)果1:

2.異步執(zhí)行
CompletableFuture 提供了兩個(gè)方法用于異步執(zhí)行:
CompletableFuture.runAsync,沒有返回值;CompletableFuture.supplyAsync,有返回值。
示例:
public static void main(String[] args) throws ExecutionException, InterruptedException {
// runAsync 沒有返回值
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> System.out.println("future1 executed."));
// supplyAsync 有返回值
CompletableFuture<Object> future2 = CompletableFuture.supplyAsync(() -> {
System.out.println("future2 executed.");
return "result";
});
System.out.println("future1.get(): " + future1.get());
System.out.println("future2.get(): " + future2.get());
}
輸出結(jié)果:

3.守護(hù)線程
CompletableFuture返回的Future默認(rèn)為守護(hù)線程,如果不調(diào)用get()獲取結(jié)果,主線程結(jié)束后會(huì)自動(dòng)結(jié)束。主要有以下4種情景:
- 情景1: 執(zhí)行時(shí)間 > 主線程時(shí)間,異步線程
會(huì)執(zhí)行; - 情景2: 執(zhí)行時(shí)間 > 主線程,是守護(hù)線程,會(huì)被殺死,異步線程
不會(huì)執(zhí)行; - 情景3: 執(zhí)行時(shí)間 > 主線程,但是不是守護(hù)線程,不會(huì)被殺死,異步線程
會(huì)執(zhí)行; - 情景4: ExecutorService.submit(),默認(rèn)不是守護(hù)線程,不會(huì)被殺死,異步線程
會(huì)執(zhí)行。
示例:
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 1.執(zhí)行時(shí)間 < 主線程,會(huì)打印
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() ->
System.out.println("Thread1 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon()));
// 2.執(zhí)行時(shí)間 > 主線程,是守護(hù)線程,會(huì)被殺死,不會(huì)打印
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(3000L);
System.out.println("Thread2 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon());
} catch (InterruptedException e) {
e.printStackTrace();
}});
// 3.執(zhí)行時(shí)間 > 主線程,但是不是守護(hù)線程,不會(huì)被殺死,會(huì)打印
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1000L);
System.out.println("Thread3 等待1秒");
System.out.println("Thread3 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon());
} catch (InterruptedException e) {
e.printStackTrace();
}}, executorService);
// 4.ExecutorService.submit(),默認(rèn)不是守護(hù)線程,不會(huì)被殺死,會(huì)打印。
executorService.submit(() -> {
try {
Thread.sleep(2000L);
System.out.println("Thread4 等待2秒");
System.out.println("Thread4 是否為守護(hù)線程 : " + Thread.currentThread().isDaemon());
} catch (InterruptedException e) {
e.printStackTrace();
}});
// 主線程執(zhí)行完畢
System.out.println("Main Thread Finished.");
executorService.shutdown();
}
輸出結(jié)果2:

4.處理執(zhí)行結(jié)果
CompletableFuture還封裝了很多處理執(zhí)行結(jié)果操作。操作太多,列舉比較常用的幾種:
thenAccept(): 對(duì)結(jié)果進(jìn)行使用;
thenApply(): 對(duì)結(jié)果進(jìn)行轉(zhuǎn)換;
exceptionally(): 對(duì)異常進(jìn)行處理;
whenComplete(): 相當(dāng)于 thenAccept() + thenApply() + exceptionally().

示例:
public static void main(String[] args) {
// thenAccept對(duì)結(jié)果進(jìn)行使用
System.out.println("------------------------------");
CompletableFuture.supplyAsync(() -> "Thread1 Finished.").thenAccept(System.out::println);
// thenApply對(duì)結(jié)果進(jìn)行轉(zhuǎn)換
System.out.println("------------------------------");
CompletableFuture.supplyAsync(() -> "Thread2 Finished.")
.thenApply(s -> s + " + thenApply()")
.thenAccept(System.out::println);
// exceptionally對(duì)異常進(jìn)行處理
System.out.println("------------------------------");
CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Thread3 Failed.");})
.exceptionally(Throwable::toString).thenAccept(System.out::println);
// 主線程執(zhí)行完畢
System.out.println("------------------------------");
System.out.println("Main Thread Finished.");
}
輸出結(jié)果:

whenComplete() 示例:
public static void main(String[] args) throws ExecutionException, InterruptedException {
// thenAccept對(duì)結(jié)果進(jìn)行使用
System.out.println("------------------------------");
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Thread1 Finished.").whenComplete(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) {
System.out.println("result: " + s);
System.out.println("throwable: " + throwable);
}
});
// exceptionally對(duì)異常進(jìn)行處理
System.out.println("------------------------------");
CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Thread3 Failed.");
}).whenComplete(new BiConsumer<Object, Throwable>() {
@Override
public void accept(Object s, Throwable throwable) {
System.out.println("result: " + s);
System.out.println("throwable: " + throwable);
}
});
System.out.println("------------------------------");
System.out.println("future.get(): " + future.get());
// 主線程執(zhí)行完畢
System.out.println("------------------------------");
System.out.println("Main Thread Finished.");
}
輸出結(jié)果:

整理完畢,完結(jié)撒花~
以上就是Java8 CompletableFuture 異步執(zhí)行的詳細(xì)內(nèi)容,更多關(guān)于Java8 CompletableFuture 異步執(zhí)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot?整合mybatis+mybatis-plus的詳細(xì)步驟
這篇文章主要介紹了SpringBoot?整合mybatis+mybatis-plus的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明
這篇文章主要介紹了Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
基于Java的MathML轉(zhuǎn)圖片的方法(示例代碼)
最近接到一個(gè)新需求mathML轉(zhuǎn)圖片怎么實(shí)現(xiàn)呢?剛開始還真是蒙圈了,不知道怎么實(shí)現(xiàn),今天小編記錄一種基于Java的MathML轉(zhuǎn)圖片的方法,感興趣的朋友一起看看吧2021-06-06
java線程中斷?interrupt?和?LockSupport解析
這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
java計(jì)算機(jī)器人的運(yùn)動(dòng)范圍
這篇文章主要為大家詳細(xì)介紹了java計(jì)算機(jī)器人運(yùn)動(dòng)范圍的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Java讀取txt文件中的數(shù)據(jù)賦給String變量方法
今天小編就為大家分享一篇Java讀取txt文件中的數(shù)據(jù)賦給String變量方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器的方法
ChatGPT是一款基于自然語言處理技術(shù)的聊天機(jī)器人,ChatGPT可以模擬真實(shí)的人類對(duì)話,并能夠更貼近用戶的需求,提供更有價(jià)值的服務(wù),這篇文章主要介紹了基于ChatGPT+SpringBoot實(shí)現(xiàn)智能聊天AI機(jī)器人接口并上線至服務(wù)器,需要的朋友可以參考下2023-02-02

