MST

星途 面试题库

面试题:Java中CompletableFuture的anyOf方法原理及使用场景

请简述Java中CompletableFuture的anyOf方法的工作原理,并举例说明在哪些场景下使用它可以提高任务执行效率。
39.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

CompletableFuture的anyOf方法工作原理

anyOf 方法接收一个或多个 CompletableFuture 作为参数,它返回一个新的 CompletableFuture。这个新的 CompletableFuture 会在任何一个传入的 CompletableFuture 完成(不管是正常完成还是异常完成)时就完成,并且其结果是第一个完成的 CompletableFuture 的结果(如果是正常完成)或者异常(如果第一个完成的是异常完成)。

应用场景及示例

  1. 多个数据源查询,取最先返回的结果 假设要从多个电商平台查询某商品的价格,只需要获取最先返回的价格,代码示例如下:
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 的结果完成,从而快速获取到商品价格,提高了任务执行效率。

  1. 多个服务尝试执行操作,只要一个成功即可 比如要尝试多个备份服务器来执行数据恢复操作,只要有一个服务器成功恢复数据,就不需要再等待其他服务器的操作。代码示例如下:
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 方法使得只要有一个备份服务器成功恢复数据,整个操作就可以结束,无需等待其他备份服务器完成操作,提高了执行效率。