面试题答案
一键面试CompletableFuture的anyOf方法适用场景
anyOf
方法适用于当多个异步任务并行执行,我们只关心其中任意一个任务最先完成的结果的场景。例如,在进行多个数据源查询时,只要其中一个数据源成功返回数据,就可以停止其他查询,这样可以提高效率,减少不必要的资源消耗。
代码示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureAnyOfExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建多个异步任务
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000); // 模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result from Future 1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // 模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result from Future 2";
});
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(3000); // 模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result from Future 3";
});
// 使用anyOf方法获取最先完成的任务的结果
CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2, future3);
// 处理结果
Object result = anyOfFuture.get();
System.out.println("First completed task result: " + result);
}
}
在上述代码中:
- 创建了三个异步任务
future1
、future2
和future3
,每个任务通过CompletableFuture.supplyAsync
方法异步执行,并模拟了不同的执行耗时。 - 使用
CompletableFuture.anyOf
方法传入这三个任务,返回一个新的CompletableFuture
,这个新的CompletableFuture
会在任意一个传入的任务完成时完成。 - 通过调用
get
方法获取最先完成任务的结果,并打印输出。