Java CompletableFuture之異步執(zhí)行、鏈?zhǔn)秸{(diào)用、組合多個(gè)Future、異常處理和超時(shí)控制等詳解
Java ComputableFuture 代碼示例
CompletableFuture 是 Java 8 引入的一個(gè)強(qiáng)大的異步編程工具,它實(shí)現(xiàn)了 Future 接口并提供了更豐富的功能。
以下是一些常見的 CompletableFuture 使用示例:
1. 基本用法
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureBasicExample {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)CompletableFuture并異步執(zhí)行任務(wù)
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // 模擬耗時(shí)操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, CompletableFuture!";
});
// 注冊(cè)完成時(shí)的回調(diào)
future.thenAccept(result -> System.out.println("Result: " + result));
// 阻塞等待結(jié)果
try {
String result = future.get();
System.out.println("Main thread got: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}2. 鏈?zhǔn)秸{(diào)用
import java.util.concurrent.CompletableFuture;
public class CompletableFutureChainExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 第一個(gè)異步任務(wù)
System.out.println("Task 1 running in thread: " + Thread.currentThread().getName());
return "Hello";
}).thenApplyAsync(result -> {
// 第二個(gè)異步任務(wù),接收上一個(gè)任務(wù)的結(jié)果
System.out.println("Task 2 running in thread: " + Thread.currentThread().getName());
return result + " World";
}).thenAcceptAsync(result -> {
// 第三個(gè)異步任務(wù),消費(fèi)最終結(jié)果
System.out.println("Task 3 running in thread: " + Thread.currentThread().getName());
System.out.println("Final result: " + result);
}).join(); // 等待所有任務(wù)完成
}
}3. 組合多個(gè) Future
import java.util.concurrent.CompletableFuture;
public class CompletableFutureCombineExample {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
// 合并兩個(gè)Future的結(jié)果
CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);
combinedFuture.thenAccept(System.out::println).join();
}
}4. 異常處理
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException("Something went wrong!");
}
return "Success";
}).exceptionally(ex -> {
System.out.println("Exception occurred: " + ex.getMessage());
return "Recovered from exception";
}).thenAccept(System.out::println).join();
}
}5. 并行執(zhí)行多個(gè)任務(wù)
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureAllOfExample {
public static void main(String[] args) {
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
sleep(1);
return "Task 1";
});
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
sleep(2);
return "Task 2";
});
CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> {
sleep(3);
return "Task 3";
});
// 等待所有任務(wù)完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(task1, task2, task3);
// 獲取所有任務(wù)的結(jié)果
CompletableFuture<String> combinedFuture = allFutures.thenApply(v -> {
String result1 = task1.join();
String result2 = task2.join();
String result3 = task3.join();
return result1 + ", " + result2 + ", " + result3;
});
System.out.println("Combined result: " + combinedFuture.join());
}
private static void sleep(int seconds) {
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}6. 超時(shí)處理(Java 9+)
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class CompletableFutureTimeoutExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000); // 模擬耗時(shí)操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result";
});
// 設(shè)置超時(shí)時(shí)間為1秒
CompletableFuture<String> timeoutFuture = future.orTimeout(1, TimeUnit.SECONDS);
timeoutFuture.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("Exception: " + ex.getClass().getName());
if (ex.getCause() instanceof TimeoutException) {
System.out.println("Task timed out");
}
} else {
System.out.println("Result: " + result);
}
}).join();
}
}這些示例展示了 CompletableFuture 的主要功能,包括異步執(zhí)行、鏈?zhǔn)秸{(diào)用、組合多個(gè) Future、異常處理和超時(shí)控制等。CompletableFuture 是 Java 并發(fā)編程中非常強(qiáng)大的工具,可以大大簡(jiǎn)化異步編程的復(fù)雜性。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼
這篇文章主要介紹了Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
netflix.discovery.shared.transport.TransportException:Cannot
這篇文章主要介紹了netflix.discovery.shared.transport.TransportException:Cannot execute request on any known server報(bào)錯(cuò)問題及解決方法,感興趣的朋友一起看看吧2023-09-09
Spring中@Import的各種用法以及ImportAware接口詳解
這篇文章主要介紹了Spring中@Import的各種用法以及ImportAware接口詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
java中Statement 與 PreparedStatement接口之間的關(guān)系和區(qū)別
這篇文章主要介紹了java中Statement 與 PreparedStatement接口之間的關(guān)系和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

