面试题答案
一键面试import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureSequentialExecution {
public static void main(String[] args) {
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
// 模拟任务A
System.out.println("任务A开始执行");
if (Math.random() < 0.5) {
throw new RuntimeException("任务A执行失败");
}
System.out.println("任务A执行成功");
return "任务A的结果";
})
.thenApplyAsync(result -> {
// 任务B依赖任务A的结果
System.out.println("任务B开始执行,依赖任务A的结果: " + result);
if (Math.random() < 0.5) {
throw new RuntimeException("任务B执行失败");
}
System.out.println("任务B执行成功");
return "任务B的结果";
})
.thenAcceptAsync(result -> {
// 任务C依赖任务B的结果
System.out.println("任务C开始执行,依赖任务B的结果: " + result);
if (Math.random() < 0.5) {
throw new RuntimeException("任务C执行失败");
}
System.out.println("任务C执行成功");
})
.exceptionally(ex -> {
// 全局异常处理
System.out.println("发生异常: " + ex.getMessage());
return null;
});
try {
future.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
上述代码中:
CompletableFuture.supplyAsync
方法创建并异步执行任务A,在任务A中模拟了可能的失败情况。thenApplyAsync
方法依赖任务A的结果,执行任务B,并同样模拟了任务B可能的失败情况。thenAcceptAsync
方法依赖任务B的结果,执行任务C,也模拟了任务C可能的失败情况。exceptionally
方法对整个任务链中的异常进行统一处理,在异常发生时打印异常信息。最后通过future.get()
获取最终结果,这里主要是为了等待任务执行完成。