MST

星途 面试题库

面试题:Java CompletableFuture anyOf处理异常情况

在使用CompletableFuture的anyOf方法时,如果其中一个任务抛出异常,其他任务会如何?如何正确处理这种异常情况以确保整个任务执行流程的稳定性和正确性?请结合代码示例说明。
31.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 其他任务的情况

    • CompletableFuture.anyOf 方法会返回一个新的 CompletableFuture,当其中任何一个 CompletableFuture 完成(正常完成或抛出异常)时,这个新的 CompletableFuture 就会完成。
    • 其他任务不会因为其中一个任务抛出异常而被取消或中断,它们会继续执行。
  2. 正确处理异常情况

    • 可以通过 exceptionally 方法来处理异常,确保整个任务执行流程的稳定性和正确性。

以下是代码示例:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureAnyOfExample {
    public static void main(String[] args) {
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            if (Math.random() > 0.5) {
                throw new RuntimeException("Task 1 failed");
            }
            return "Result of Task 1";
        });

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            if (Math.random() > 0.5) {
                throw new RuntimeException("Task 2 failed");
            }
            return "Result of Task 2";
        });

        CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2);

        anyOfFuture.thenApply(result -> {
            System.out.println("Task completed successfully: " + result);
            return result;
        }).exceptionally(ex -> {
            System.out.println("An exception occurred: " + ex.getMessage());
            return null;
        }).join();
    }
}

在上述代码中:

  • 创建了两个 CompletableFuturefuture1future2,它们模拟了可能会抛出异常的任务。
  • 使用 CompletableFuture.anyOf 方法将这两个任务组合起来。
  • 通过 thenApply 方法处理任务正常完成的情况,通过 exceptionally 方法处理任务抛出异常的情况。这样无论任务是正常完成还是抛出异常,整个流程都能稳定运行并正确处理结果或异常。