CompletableFuture

102 阅读2分钟

CompletableFuture

CompletableFuture 是 Java8 引入的一个多线程编程工具,它提供了一种方便的异步编程的方式,特别适用于解决多个任务之间存在的依赖关系的场景。下面将对 CompletableFuture 的常用方法进行详细介绍。

创建 CompletableFuture

CompletableFuture 的创建方式有很多,下面是一些常见的方式:

  • 通过 CompletableFuture.supplyAsync() 方法创建 CompletableFuture:

    CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
        // 做一些任务
        return "result";
    });
    
  • 通过 CompletableFuture.runAsync() 方法创建一个 CompletableFuture:

    CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
        // 做一些任务
    });
    
  • 通过 CompletableFuture.completedFuture() 方法创建一个已完成的 future:

    CompletableFuture<String> completableFuture = CompletableFuture.completedFuture("hello");
    

    串行执行任务

    在 CompletableFuture 中,我们可以使用 thenApply() 和 thenAccept() 方法来对一个任务的结果进行处理。

    thenApply() 方法会将任务的执行结果作为参数传递给下一个任务,而 thenAccept() 方法则直接对任务的执行结果进行处理

    下面是一个简单的例子:

    CompletableFuture.supplyAsync(() -> "Hello")
        .thenApply(s -> s + " world")
        .thenAccept(System.out::println);
    

    这个例子中,我们先以字符串 "Hello" 为起点创建了一个 CompletableFuture,然后通过 thenApply() 方法将其处理成了 "Hello world",最后通过 thenAccept() 方法直接输出了 "Hello world"。

    并行执行多个任务

    使用 CompletableFuture,可以将多个任务并行执行,使用 CompletableFuture.allOf() 方法可以同时等待所有的任务执行完成。

    下面是一个例子:

    CompletableFuture<Void> all = CompletableFuture.allOf(
        CompletableFuture.runAsync(() -> {
            // 做一些任务1
        }),
        CompletableFuture.runAsync(() -> {
            // 做一些任务2
        }),
        CompletableFuture.runAsync(() -> {
            // 做一些任务3
        })
    );
    

all.join(); // 等待所有任务执行完成

异常处理

当一个 CompletableFuture 执行出现异常时,我们可以使用 exceptionally() 方法来处理这个异常。 下面是一个例子:

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
        // 做一些任务
        if (true) {
            throw new RuntimeException("任务出现异常");
        }
        return "result";
    })
    .exceptionally(ex -> {
        System.err.println("任务出现异常:" + ex);
        return "exception";
    });

在这个例子中,我们在任务中通过 throw 抛出了一个异常,然后通过 exceptionally() 方法将这个异常进行了处理。

结合两个 CompletableFuture 的执行结果

在 CompletableFuture 中,我们可以使用 thenCombine() 方法结合两个 CompletableFuture 的执行结果。 下面是一个例子:

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> " world");
​
CompletableFuture<String> result = future1.thenCombine(future2, (s1, s2) -> s1 + s2);
System.out.println(result.get()); // 输出 "Hello world"

在这个例子中,我们先分别创建了两个 CompletableFuture,然后通过 thenCombine() 方法对它们的执行结果进行了结合。

其他常用方法

• thenCompose() —— 在一个 CompletableFuture 的执行结果中执行另一个 CompletableFuture。

• anyOf() —— 只要有一个 CompletableFuture 执行完成就返回。

• applyToEither() —— 当两个 CompletableFuture 中有一个执行完成时,将其执行结果作为参数传递给下一个任务。

• runAfterEither() —— 当两个 CompletableFuture 中有一个执行完成时,执行下一个任务。

• runAfterBoth() —— 当两个 CompletableFuture 都执行完成时,执行下一个任务。

以上就是 CompletableFuture 的一个简单介绍,它是一个非常强大的异步编程工具,对于解决多个任务之间依赖关系的问题非常有帮助。