面试题答案
一键面试import java.util.concurrent.CompletableFuture;
public class AsyncTaskExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 模拟任务A
System.out.println("任务A开始执行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务A执行完毕");
return "任务A的结果";
}).thenApplyAsync(result -> {
// 任务B依赖任务A的结果
System.out.println("任务B开始执行,依赖任务A的结果: " + result);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务B执行完毕");
return "任务B的最终结果";
}).thenAccept(System.out::println);
}
}
涉及的方法和原理
- supplyAsync:
- 这是
CompletableFuture
类的静态方法,用于异步执行一个有返回值的任务。它接收一个Supplier
作为参数,在新的线程中执行Supplier
的get
方法,并返回一个CompletableFuture
对象,该对象在任务完成时包含Supplier
的返回值。
- 这是
- thenApplyAsync:
- 这个方法用于在当前
CompletableFuture
完成后,异步执行一个Function
。它接收一个Function
作为参数,该Function
的输入是当前CompletableFuture
的结果,输出是新的结果。它返回一个新的CompletableFuture
,该CompletableFuture
在Function
执行完成时完成,并包含Function
的返回值。这里任务B依赖任务A的结果,就通过thenApplyAsync
将任务A的结果作为输入来执行任务B。
- 这个方法用于在当前
- thenAccept:
- 此方法用于在当前
CompletableFuture
完成时,异步执行一个Consumer
。它接收一个Consumer
作为参数,该Consumer
的输入是当前CompletableFuture
的结果。这里使用thenAccept
来打印任务B的最终结果。
- 此方法用于在当前
整个流程就是通过CompletableFuture
的链式调用,实现任务A先执行,任务B依赖任务A的结果再执行的顺序执行逻辑。