import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
// 模拟除零错误
return 10 / 0;
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
CompletableFuture<Object> combinedFuture = CompletableFuture.anyOf(future1, future2);
combinedFuture.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("捕获到异常:");
ex.printStackTrace();
} else {
System.out.println("任务成功完成,结果: " + result);
}
});
// 防止主线程退出
while (!combinedFuture.isDone()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
异常处理机制解释
anyOf
方法:CompletableFuture.anyOf
方法会返回一个新的 CompletableFuture
,当任何一个传入的 CompletableFuture
完成(正常完成或异常完成)时,这个新的 CompletableFuture
就会完成。
- 异常捕获:通过
whenComplete
方法,它接收两个参数,一个是结果(如果任务正常完成),另一个是异常(如果任务异常完成)。当其中一个任务抛出异常时,ex
参数不为 null
,此时可以在 whenComplete
的代码块中捕获并处理异常,这里通过打印异常堆栈信息来处理。
- 继续监控其他任务:
anyOf
方法并不会因为其中一个任务抛出异常就停止监控其他任务。即使 future1
抛出异常,future2
仍然会继续执行。当 future2
成功完成时,combinedFuture
也会完成,并且 whenComplete
中的 result
参数会包含 future2
的结果,从而打印出成功完成任务的结果。