面试鸭 Java 后端面试题, 如何使用 Java 的 CompletableFuture 实现异步编排?
面试鸭 Java 后端面试题, 如何使用 Java 的 CompletableFuture 实现异步编排?
QA
Step 1
Q:: 如何使用 Java 的 CompletableFuture 实现异步编排?
A:: Java 的 CompletableFuture 提供了一种优雅的方式来处理异步编排。使用 thenApply、thenCompose、thenCombine 等方法可以将多个异步任务进行组合。比如,thenApply 可以在某个异步任务完成后处理其结果,而 thenCompose 则可以用于链接多个异步任务,使后续任务依赖于前一个任务的结果。你还可以使用 allOf 或 anyOf 方法来并行执行多个异步任务。以下是一个简单的示例:
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Task1");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Task2");
CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);
combinedFuture.thenAccept(System.out::println);
这个示例中,两个异步任务被组合,最终输出了 "Task1 Task2"
。
Step 2
Q:: CompletableFuture 和 Future 的区别是什么?
A:: CompletableFuture 是 Java 8
引入的一种更高级的 Future。它不仅支持 Future 的基本功能,还允许手动完成计算、组合多个异步任务、处理异步任务的完成结果。Future 只能通过阻塞或轮询来获取结果,而 CompletableFuture 提供了丰富的非阻塞 API,使得异步编排更加方便。
Step 3
Q:: CompletableFuture 中的异常处理如何实现?
A:: CompletableFuture 提供了 exceptionally 和 handle 方法来处理异步任务中的异常。exceptionally 方法允许在任务出现异常时提供一个备用结果,而 handle 方法则无论任务是否出现异常都会被调用。使用这些方法,你可以更加灵活地处理异步操作中的错误。例如:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (new Random().nextBoolean()) {
throw new RuntimeException("Error occurred");
}
return "Success";
});
future.exceptionally(ex -> "Failed with: " + ex.getMessage())
.thenAccept(System.out::println);
Step 4
Q:: 如何取消一个正在执行的 CompletableFuture?
A:: 你可以调用 CompletableFuture 的 cancel(boolean mayInterruptIfRunning)
方法来取消一个正在执行的任务。如果传入 true,正在执行的任务将尝试被中断(如果任务支持中断);如果传入 false,则不会中断正在执行的任务,只会取消后续的执行或结果获取。需要注意的是,任务是否能被中断取决于它的实现。
Step 5
Q:: CompletableFuture 有哪些常见的用法模式?
A:: CompletableFuture 常见的用法模式包括:
1.
串行异步任务:使用 thenApply 或 thenCompose 依次执行多个依赖任务。
2.
并行异步任务:使用 allOf 或 anyOf 同时运行多个任务。
3.
异常处理:使用 exceptionally 或 handle 处理异常情况。
4.
组合多个异步任务的结果:使用 thenCombine 或 thenAcceptBoth 等方法。
5.
超时控制:使用 orTimeout 或 completeOnTimeout 方法设置任务超时策略。