面试题答案
一键面试CompletableFuture的anyOf方法工作原理
anyOf
方法接收一个或多个 CompletableFuture
作为参数,它返回一个新的 CompletableFuture
。这个新的 CompletableFuture
会在任何一个传入的 CompletableFuture
完成(不管是正常完成还是异常完成)时就完成,并且其结果是第一个完成的 CompletableFuture
的结果(如果是正常完成)或者异常(如果第一个完成的是异常完成)。
应用场景及示例
- 多个数据源查询,取最先返回的结果 假设要从多个电商平台查询某商品的价格,只需要获取最先返回的价格,代码示例如下:
import java.util.concurrent.CompletableFuture;
public class AnyOfExample {
public static void main(String[] args) {
CompletableFuture<Double> future1 = CompletableFuture.supplyAsync(() -> {
// 模拟从平台1查询价格,可能耗时较长
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 100.0;
});
CompletableFuture<Double> future2 = CompletableFuture.supplyAsync(() -> {
// 模拟从平台2查询价格,可能耗时较短
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 95.0;
});
CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2);
anyOfFuture.thenAccept(result -> {
if (result instanceof Double) {
System.out.println("最先返回的价格: " + (Double) result);
} else if (result instanceof Throwable) {
System.out.println("查询价格时发生异常: " + ((Throwable) result).getMessage());
}
}).join();
}
}
在这个例子中,future2
可能会先完成,anyOfFuture
会以 future2
的结果完成,从而快速获取到商品价格,提高了任务执行效率。
- 多个服务尝试执行操作,只要一个成功即可 比如要尝试多个备份服务器来执行数据恢复操作,只要有一个服务器成功恢复数据,就不需要再等待其他服务器的操作。代码示例如下:
import java.util.concurrent.CompletableFuture;
public class BackupRestoreExample {
public static void main(String[] args) {
CompletableFuture<String> backup1 = CompletableFuture.supplyAsync(() -> {
// 模拟从备份服务器1恢复数据,可能失败
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (Math.random() > 0.5) {
throw new RuntimeException("备份服务器1恢复失败");
}
return "从备份服务器1恢复成功";
});
CompletableFuture<String> backup2 = CompletableFuture.supplyAsync(() -> {
// 模拟从备份服务器2恢复数据,可能成功
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (Math.random() > 0.3) {
return "从备份服务器2恢复成功";
} else {
throw new RuntimeException("备份服务器2恢复失败");
}
});
CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(backup1, backup2);
anyOfFuture.thenAccept(result -> {
if (result instanceof String) {
System.out.println(result);
} else if (result instanceof Throwable) {
System.out.println("所有备份服务器恢复均失败: " + ((Throwable) result).getMessage());
}
}).join();
}
}
在这个场景中,anyOf
方法使得只要有一个备份服务器成功恢复数据,整个操作就可以结束,无需等待其他备份服务器完成操作,提高了执行效率。