CompletableFuture的特点以及常规使用

2023-04-30 14:53:38 浏览数 (1)

需求:系统接口比较慢,有的接口会通过许多数据库io或者网络io需一些数据,如果接口内这部分请求都是串行的会比较浪费时间,咱们这里可以做并行请求

一 CompletableFuture的介绍

CompletableFuture是Java 8引入的一个新特性,是一种用于异步编程的工具类。它可以用于处理异步任务,例如网络请求、文件读写、数据库查询等等,使得这些任务可以并发执行并在完成时得到通知。

CompletableFuture的原理主要是基于Java的Future模式和函数式编程思想。它封装了一个异步操作,并在操作完成后返回一个Future对象,可以通过该对象获取异步操作的结果。在异步操作完成之前,可以执行一些其他的操作,这些操作可以是同步的,也可以是异步的。

CompletableFuture具有以下特点:

  1. 可以链式调用:通过调用thenApply()thenAccept()thenRun()等方法,可以将多个异步操作链接在一起。
  2. 支持异常处理:可以使用exceptionally()handle()等方法处理异步操作抛出的异常。
  3. 支持合并操作:可以使用thenCombine()thenCompose()allOf()等方法合并多个异步操作的结果。
  4. 支持异步执行:可以使用CompletableFuture.supplyAsync()CompletableFuture.runAsync()等方法来执行异步操作。

在实现上,CompletableFuture使用了Java的线程池来实现异步执行,它可以在任务完成时通知等待该结果的线程。当CompletableFuture的结果被设置时,它会通知所有等待该结果的线程,使得它们可以继续执行。

总之,CompletableFuture提供了一种方便的异步编程方式,它通过利用Java的Future模式和函数式编程思想来实现。它可以帮助我们更加简单和高效地处理异步任务,提高代码的可读性和可维护性。

二 使用

当使用 CompletableFuture 时,我们通常需要执行以下步骤:

  1. 创建一个 CompletableFuture 对象。
  2. 执行一个异步操作,可以使用 CompletableFuture.supplyAsync()CompletableFuture.runAsync() 方法。
  3. 调用 thenApply()thenAccept()thenRun() 等方法,将操作链起来。
  4. 调用 join() 方法获取异步操作的结果。

下面是一些常见的 CompletableFuture 使用场景及示例代码:

  1. 异步执行任务并获取结果:
代码语言:javascript复制
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务
    return "hello world";
});

String result = future.join();
System.out.println(result);
  1. 顺序执行多个异步任务:
代码语言:javascript复制
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务1
    return "hello";
}).thenApplyAsync((String s) -> {
    // 异步执行任务2,依赖于任务1的结果
    return s   " world";
}).thenApplyAsync((String s) -> {
    // 异步执行任务3,依赖于任务2的结果
    return s.toUpperCase();
});

String result = future.join();
System.out.println(result);
  1. 并发执行多个异步任务并等待结果:
代码语言:javascript复制
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务1
    return "hello";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务2
    return "world";
});

CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务3
    return "!";
});

CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
allFutures.join();

System.out.println(future1.join()   " "   future2.join()   future3.join());
  1. 处理异步任务抛出的异常:
代码语言:javascript复制
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 异步执行任务
    throw new RuntimeException("error");
}).exceptionally((Throwable t) -> {
    // 处理异常
    return "default";
});

String result = future.join();
System.out.println(result);
  1. 串行执行多个异步任务:
代码语言:javascript复制
CompletableFuture<String> future = CompletableFuture.completedFuture("hello")
        .thenComposeAsync((String s) -> {
            // 异步执行任务2,依赖于任务1的结果
            return CompletableFuture.completedFuture(s   " world");
        })
        .thenComposeAsync((String s) -> {
            // 异步执行任务3,依赖于任务2的结果
            return CompletableFuture.completedFuture(s.toUpperCase());
        });

String result = future.join();
System.out.println(result);

上述示例代码只是 CompletableFuture 的一些常规使用场景,实际上 CompletableFuture 可以支持更加复杂的场景,如链式调用、合并操作等。

0 人点赞