面试题答案
一键面试代码实现
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
System.out.println("Task 1 is running");
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
System.out.println("Task 2 is running");
throw new RuntimeException("Task 2 failed");
});
CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {
System.out.println("Task 3 is running");
});
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.whenComplete((v, ex) -> {
if (ex != null) {
System.out.println("Caught exception: " + ex.getMessage());
} else {
System.out.println("All tasks completed successfully");
}
}).join();
}
}
处理机制解释
- CompletableFuture.allOf():该方法用于组合多个CompletableFuture,只有当所有的CompletableFuture都正常完成时,它返回的CompletableFuture才会正常完成。如果其中任何一个CompletableFuture抛出异常,那么
allOf
返回的CompletableFuture也会以相同的异常完成。 - whenComplete((v, ex) -> {...}):这是一个用于注册回调的方法,无论CompletableFuture正常完成还是异常完成都会被调用。它接受两个参数,第一个参数
v
是CompletableFuture正常完成时的结果(在runAsync
方法返回的CompletableFuture中,v
为null
,因为runAsync
没有返回值),第二个参数ex
是异常对象,如果CompletableFuture正常完成,ex
为null
,如果出现异常,ex
则为对应的异常实例。 - if (ex != null) {...}:在
whenComplete
的回调中,通过判断ex
是否为null
,可以确定是否有异常发生。如果ex
不为null
,就说明某个任务抛出了异常,这时可以对异常进行相应的处理,例如打印异常信息等。
这样就可以优雅地捕获并处理CompletableFuture.allOf()
组合的多个异步任务中抛出的异常。