Java 并发面试题, 什么是 Java 的 CompletableFuture?
Java 并发面试题, 什么是 Java 的 CompletableFuture?
QA
Step 1
Q:: 什么是 Java 的 CompletableFuture?
A:: CompletableFuture 是 Java 8
引入的一个类,用于表示一个异步计算的结果。它实现了 Future 接口,并提供了许多用于异步编程和并发处理的新方法,使得异步代码更易于编写和理解。CompletableFuture 支持完成、合成和组合多个任务,允许开发者以声明性的方式编写异步代码。
Step 2
Q:: CompletableFuture 和 Future 的主要区别是什么?
A:: Future 是 Java 5
引入的接口,它表示一个可能在将来完成的任务的结果,但其功能较为有限,无法直接处理任务的完成状态或结果。CompletableFuture 扩展了 Future 的功能,提供了更多的方法,如 thenApply、thenAccept、thenRun 等,允许链式调用和异步任务的组合。此外,CompletableFuture 还支持手动完成(通过 complete 方法)和异常处理。
Step 3
Q:: 如何使用 CompletableFuture 实现异步编程?
A:: 可以使用 CompletableFuture.supplyAsync() 或 CompletableFuture.runAsync()
方法来启动异步任务。例如:
CompletableFuture.supplyAsync(() -> {
// 异步任务
return someResult;
}).thenApply(result -> {
// 处理任务结果
return anotherResult;
});
通过 thenApply、thenAccept 和 thenRun 方法,可以将多个异步任务进行链式调用和组合。
Step 4
Q:: CompletableFuture 的异常处理机制是怎样的?
A:: CompletableFuture 提供了 exceptionally 和 handle 方法用于异常处理。exceptionally 方法用于在任务执行过程中发生异常时提供一个默认值,而 handle 方法允许在任务完成(无论成功还是失败)时执行特定的逻辑。例如:
CompletableFuture.supplyAsync(() -> {
// 可能抛出异常的异步任务
}).exceptionally(ex -> {
// 处理异常
return defaultValue;
});
Step 5
Q:: CompletableFuture 的 combine 方法有什么作用?
A:: CompletableFuture 的 thenCombine 方法用于将两个独立的异步任务的结果进行组合。该方法接受另一个 CompletableFuture 和一个 BiFunction,将两个任务的结果进行合并。例如:
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);
combinedFuture.thenAccept(System.out::println); // 输出 30