面试题答案
一键面试在Java中,可以使用CompletableFuture
的thenCombine
方法来实现任务C依赖任务A和任务B都成功完成后执行,并通过whenComplete
方法来监控任务的执行状态。示例代码如下:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureDependencyExample {
public static void main(String[] args) {
CompletableFuture<Void> taskA = CompletableFuture.runAsync(() -> {
// 模拟任务A的执行
System.out.println("Task A is running...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task A completed.");
});
CompletableFuture<Void> taskB = CompletableFuture.runAsync(() -> {
// 模拟任务B的执行
System.out.println("Task B is running...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task B completed.");
});
CompletableFuture<Void> taskC = taskA.thenCombine(taskB, (a, b) -> {
// 任务C在任务A和B都完成后执行
System.out.println("Task C is running...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task C completed.");
return null;
});
taskC.whenComplete((result, ex) -> {
if (ex == null) {
System.out.println("All tasks completed successfully.");
} else {
System.out.println("An error occurred: " + ex.getMessage());
}
});
// 防止主线程提前退出
try {
taskC.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
- 创建任务A和任务B:
- 使用
CompletableFuture.runAsync
方法来异步执行任务A和任务B。这些任务会在独立的线程中运行。
- 使用
- 创建依赖任务C:
- 使用
taskA.thenCombine(taskB, ...)
方法,该方法接收任务B,并在任务A和任务B都成功完成后执行一个组合操作。这里组合操作中执行任务C的逻辑。
- 使用
- 监控任务执行状态:
- 使用
taskC.whenComplete
方法,该方法会在任务C完成时(无论是正常完成还是异常完成)被调用。在这个回调中,可以根据是否有异常来判断整个流程是否成功,并输出相应的状态信息。
- 使用
- 防止主线程提前退出:
- 使用
taskC.get()
方法,该方法会阻塞主线程,直到任务C完成,这样可以确保在所有任务执行完毕后程序才退出。
- 使用