面试题答案
一键面试import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
// 模拟任务A
CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
// 模拟一些耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return 5;
});
// 模拟任务B
CompletableFuture<Integer> taskB = CompletableFuture.supplyAsync(() -> {
// 模拟一些耗时操作
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return 3;
});
// 任务C依赖于任务A和任务B的结果
CompletableFuture<Integer> taskC = taskA.thenCombine(taskB, (a, b) -> {
return a + b;
}).exceptionally(ex -> {
System.out.println("任务执行出现异常: " + ex.getMessage());
return -1; // 返回一个默认值表示异常情况
});
// 获取任务C的结果
try {
Integer result = taskC.get();
System.out.println("任务C的结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
- 任务A和任务B的创建:
- 使用
CompletableFuture.supplyAsync
方法创建异步任务taskA
和taskB
,这两个任务会在不同的线程中执行。 - 每个任务中通过
Thread.sleep
模拟了一些耗时操作。
- 使用
- 任务C的创建与依赖:
- 使用
taskA.thenCombine(taskB, (a, b) -> {...})
方法创建任务taskC
,thenCombine
方法会在taskA
和taskB
都完成后执行,其传入的函数参数(a, b) -> a + b
将taskA
和taskB
的结果相加作为taskC
的结果。 - 使用
exceptionally
方法处理可能出现的异常情况,如果taskA
、taskB
或thenCombine
过程中出现异常,会执行exceptionally
中的逻辑,打印异常信息并返回一个默认值-1
。
- 使用
- 获取任务C的结果:
- 使用
taskC.get()
获取任务taskC
的结果,这里可能会抛出InterruptedException
和ExecutionException
,所以需要进行异常处理。
- 使用
这样就通过CompletableFuture
实现了一个任务依赖于另外两个任务结果,并处理了可能出现的异常情况。