面试题:什么是 Java 的 CompletableFuture?

CompletableFuture 是 Java 8 引入的一个类,位于 java.util.concurrent 包中。它是 Future 接口的一个实现,提供了更强大的异步编程能力。CompletableFuture 不仅支持异步任务的执行,还支持任务之间的依赖关系、组合操作以及异常处理。

1. 基本概念

  • FutureFuture 是 Java 5 引入的一个接口,用于表示异步计算的结果。它允许你检查计算是否完成,等待计算完成,并获取计算结果。
  • CompletableFutureCompletableFuture 是 Future 的增强版,提供了更多的功能,如任务组合、异常处理、手动完成任务等。

2. 创建 CompletableFuture

  • 使用 supplyAsync 或 runAsync
    • supplyAsync 用于有返回值的异步任务。
    • runAsync 用于无返回值的异步任务。
      CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
          // 异步任务
          return "Hello, World!";
      });
      
      CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
          // 异步任务
      });
  • 手动完成
    • 你可以手动完成一个 CompletableFuture,并设置其结果或异常。
      CompletableFuture<String> future = new CompletableFuture<>();
      future.complete("Manual Completion");

3. 任务组合

  • thenApply:对前一个任务的结果进行转换。
  • thenAccept:消费前一个任务的结果,无返回值。
  • thenRun:在前一个任务完成后执行一个操作,不关心前一个任务的结果。
  • thenCompose:用于将两个 CompletableFuture 串联起来,前一个任务的结果作为下一个任务的输入。
  • thenCombine:用于将两个 CompletableFuture 并行执行,并在两者都完成后对结果进行合并。

4. 异常处理

  • exceptionally:处理任务执行过程中抛出的异常,并返回一个默认值。
  • handle:无论任务是否正常完成,都会执行的处理方法,可以同时处理结果和异常。

5. 多任务组合

  • allOf:等待所有任务完成。
  • anyOf:等待任意一个任务完成。
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Task 1");
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Task 2");
    
    CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
    allFutures.thenRun(() -> {
        System.out.println("All tasks completed");
    });
    
    CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2);
    anyFuture.thenAccept(System.out::println); // 输出最先完成的任务结果

6. 超时控制

  • Java 9 引入了 orTimeout 和 completeOnTimeout 方法,用于控制任务的超时行为。

7. 总结

  • CompletableFuture 提供了强大的异步编程能力,支持任务组合、异常处理、超时控制等功能。
  • 它适用于复杂的异步编程场景,能够显著提高代码的可读性和可维护性。
  • 通过合理使用 CompletableFuture,可以构建高效、灵活的并发应用程序。
THE END
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容