import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureChaining {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 模拟任务A
System.out.println("Task A is running");
if (Math.random() < 0.5) {
throw new RuntimeException("Task A failed");
}
return "Result of Task A";
})
.thenApply(resultA -> {
// 任务A成功时执行任务B
System.out.println("Task B is running with result from A: " + resultA);
if (Math.random() < 0.5) {
throw new RuntimeException("Task B failed");
}
return "Result of Task B";
})
.thenApply(resultB -> {
// 任务B成功时执行任务C
System.out.println("Task C is running with result from B: " + resultB);
if (Math.random() < 0.5) {
throw new RuntimeException("Task C failed");
}
return "Result of Task C";
})
.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("An exception occurred: " + ex.getMessage());
// 记录异常,这里简单打印,实际应用可以用日志框架等
ex.printStackTrace();
} else {
System.out.println("Final result: " + result);
}
})
.exceptionally(ex -> {
System.out.println("Exceptionally handling: " + ex.getMessage());
ex.printStackTrace();
return null;
});
// 防止主线程退出
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CompletableFuture.supplyAsync
开启一个异步任务,这里模拟任务A。
- 使用
thenApply
链式调用,在前一个任务成功完成时执行下一个任务,分别模拟任务B和任务C。
whenComplete
方法用于处理任务完成时的情况,无论是正常完成还是异常完成。如果 ex
不为 null
,表示出现异常,进行异常记录处理;否则打印最终结果。
exceptionally
方法也用于异常处理,这里简单打印异常信息并返回 null
,在实际应用中可以根据需求进行更复杂的处理。
- 最后通过
Thread.sleep
防止主线程退出,以便观察异步任务执行结果。