面试题答案
一键面试在使用 CompletableFuture
实现多个任务的 AND 组合关系时,可以通过 exceptionally
方法来优雅地处理异常,并确保其他任务也能正确释放资源。以下是代码示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureAndExceptionHandling {
public static void main(String[] args) {
CompletableFuture<Void> task1 = CompletableFuture.runAsync(() -> {
// 模拟任务1
System.out.println("Task 1 started");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Task 1 completed");
});
CompletableFuture<Void> task2 = CompletableFuture.runAsync(() -> {
// 模拟任务2,抛出异常
System.out.println("Task 2 started");
throw new RuntimeException("Task 2 failed");
});
CompletableFuture<Void> combinedTask = CompletableFuture.allOf(task1, task2)
.exceptionally(ex -> {
// 捕获异常,处理资源释放等操作
System.out.println("Caught exception: " + ex.getMessage());
// 这里可以添加其他任务的资源释放逻辑
return null;
});
try {
combinedTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在上述代码中:
- 定义了两个
CompletableFuture
任务task1
和task2
,其中task2
会抛出异常。 - 使用
CompletableFuture.allOf
方法将两个任务组合起来,实现 AND 关系。 - 对组合后的任务
combinedTask
使用exceptionally
方法,捕获异常并处理,在这个方法中可以添加其他任务的资源释放逻辑。 - 最后通过
combinedTask.get()
获取任务执行结果,exceptionally
捕获的异常不会再抛出,而是在exceptionally
方法内部处理。这样就优雅地处理了异常,并可以确保其他任务的资源释放,同时将异常信息打印出来传递给最终的处理逻辑。