java8中CompletableFuture解析

背景

在JDK8以前我们都知道Future是用来代表一个异步计算的结果的。在最新的JDK8中引入了一个新的类CompletableFuture。它和以前的Future有哪些不同?它解决Future的哪些不足?这些个问题就是我需要搞清楚的问题。

CompletionStage

在学习CompletableFuture前需要先搞清楚CompletionStage的作用。从字面意思来看,该类表示任务的完成阶段。JDK的说明文档如下:

一个可能执行的异步计算的某个阶段,在另一个CompletionStage完成时执行一个操作或计算一个值。一个阶段完成后,其计算结束。但是,该计算阶段可能会触发下一个计算阶段。

该接口的主要方法如下:

public CompletionStage thenApply(Function<? super T,? extends U> fn);

该方法的作用是在该计算阶段正常完成后,将该计算阶段的结果作为参数传递给参数fn值的函数Function,并会返回一个新的CompletionStage

public CompletionStage thenApplyAsync(Function<? super T,? extends U> fn);

该方法和上面的方法thenApply功能类似,不同的是对该计算阶段的结果进行计算的函数fn的执行时异步的。

public CompletionStage thenApplyAsync(Function<? super T,? extends U> fn, Executor executor);

该方法和上面的方法thenApplyAsync功能类似,不同的是对该计算阶段的结果进行计算的函数fn的执行时异步的, 并且是在调用者提供的线程池中执行的。

public CompletionStage thenAccept(Consumer<? super T> action);

该方法的作用是在该计算阶段完成后,将该阶段的计算结果交给一个Consumer去消费,并返回一个新的CompletionStage

public CompletionStage thenAcceptAsync(Consumer<? super T> action);

该方法的作用是在该计算阶段完成后,将该阶段的计算结果交给一个Consumer去消费,消费者的执行是异步的。最终返回一个新的CompletionStage

public CompletionStage thenAcceptAsync(Consumer<? super T> action, Executor executor);

该方法的作用是在该计算阶段完成后,将该阶段的计算结果交给一个Consumer去消费。消费者的执行是异步的,并且是在调用者提供的线程池中进行的。最终返回一个新的CompletionStage

public CompletionStage thenRun(Runnable action);

该方法的作用是在该计算阶段完成后,执行参数action指定的动作。

public CompletionStage thenRunAsync(Runnable action);

该方法的作用是在该计算阶段完成后,执行参数action指定的动作。不同的是,该动作的执行是异步的。最终返回一个新的CompletionStage

public CompletionStage thenRunAsync(Runnable action, Executor executor);

该方法的作用是在该计算阶段完成后,执行参数action指定的动作。不同的是,该动作的执行是异步的,并且是在调用者提供的线程池中异步执行的。最终返回一个新的CompletionStage

public CompletionStage thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn);

该方法的作用是在该计算阶段和参数other指定的被组合的计算阶段都正常完成后,将这两个计算阶段的计算结果作为参数,调用参数fn值的函数。 最终返回一个新的CompletionStage。

public CompletionStage thenCombineAsync(CompletionStage<? extends U> other,

BiFunction<? super T,? super U,? extends V> fn);

该方法的作用和上面方法thenCombine类似,不同点在于参数fn指定函数执行时异步的。

public CompletionStage thenCombineAsync(CompletionStage<? extends U> other,

BiFunction<? super T,? super U,? extends V> fn, Executor executor);

该方法的作用和上面方法thenCombine类似,不同点在于参数fn指定函数执行时异步的,并且是在调用者提供的线程池中进行执行的。

public CompletionStage thenAcceptBoth(CompletionStage<? extends U> other,

BiConsumer<? super T, ? super U> action);

该方法的作用在该计算阶段和被组合的计算阶段都执行完成后,将两个阶段的结果作为参数调用参数action指定的函数。

public CompletionStage thenAcceptBothAsync(CompletionStage<? extends U> other,

BiConsumer<? super T, ? super U> action);

该方法的作用在该计算阶段和被组合的计算阶段都执行完成后,将两个阶段的结果作为参数调用参数action指定的函数。但是函数的执行时异步的。

public CompletionStage thenAcceptBothAsync(CompletionStage<? extends U> other,

BiConsumer<? super T, ? super U> action, Executor executor);

该方法的作用在该计算阶段和被组合的计算阶段都执行完成后,将两个阶段的结果作为参数调用参数action指定的函数。但是函数的执行时异步的,并且是在调用者指定的线程池中执行。

public CompletionStage runAfterBoth(CompletionStage<?> other, Runnable action);

该方法的作用在该计算阶段和被组合的计算阶段都执行完成后,执行参数action指定的动作

public CompletionStage runAfterBothAsync(CompletionStage<?> other,Runnable action);

该方法的作用在该计算阶段和被组合的计算阶段都执行完成后,执行参数action指定的动作。该动作是异步执行的。

public CompletionStage runAfterBothAsync(CompletionStage<?> other, Runnable action,

Executor executor);

该方法的作用在该计算阶段和被组合的计算阶段都执行完成后,执行参数action指定的动作。该动作是异步执行的,并且是在调用者指定的线程池中。

public CompletionStage applyToEither(CompletionStage<? extends T> other,

Function<? super T, U> fn);

该方法的作用是在该计算阶段或被组合的计算阶段完成后,将对应的计算完成的结果作为参数调用参数fn指定的函数。

public CompletionStage applyToEitherAsync(CompletionStage<? extends T> other,

Function<? super T, U> fn);

该方法的作用和上面方法applyToEitherAsync的作用类似,不同的是fn的执行时异步的。

public CompletionStage applyToEitherAsync(CompletionStage<? extends T> other,

Function<? super T, U> fn, Executor executor);

该方法的作用和上面方法applyToEitherAsync的作用类似,不同的是fn的执行时异步的,并且是在调用者提供的线程池中执行。

public CompletionStage acceptEither(CompletionStage<? extends T> other,

Consumer<? super T> action);

public CompletionStage acceptEitherAsync(CompletionStage<? extends T> other,

Consumer<? super T> action);

public CompletionStage acceptEitherAsync(CompletionStage<? extends T> other,

Consumer<? super T> action, Executor executor);

public CompletionStage runAfterEither(CompletionStage<?> other, Runnable action);

public CompletionStage runAfterEitherAsync(CompletionStage<?> other, Runnable action);

public CompletionStage runAfterEitherAsync(CompletionStage<?> other, Runnable action, Executor executor);

public CompletionStage thenCompose(Function<? super T, ? extends CompletionStage> fn);

该方法的作用是在该计算阶段完成后,将该CompletionStage作为参数调用参数fn指定的函数,并最终返回一个新的CompletionStage

public CompletionStage thenComposeAsync(Function<? super T, ? extends CompletionStage> fn);

该方法的作用是在该计算阶段完成后,将该CompletionStage作为参数调用参数fn指定的函数,并最终返回一个新的CompletionStage。函数fn的执行时异步的。

public CompletionStage thenComposeAsync(Function<? super T, ? extends CompletionStage> fn, Executor executor);

该方法的作用是在该计算阶段完成后,将该CompletionStage作为参数调用参数fn指定的函数,并最终返回一个新的CompletionStage。函数fn的执行时异步的,并且在调用者指定的线程池中执行。

public CompletionStage exceptionally(Function fn);

当前计算阶段异常结束后,执行参数fn值的函数,并返回一个新的CompletionStage

public CompletionStage whenComplete(BiConsumer<? super T, ? super Throwable> action);

返回一个新的CompletionStage,新的CompletionStage和当前CompletionStage拥有相同的结果或执行异常。执行结果或异常会作为参数,调动action指定的动作。

public CompletionStage whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action);

异步执行参数指定的动作。

public CompletionStage whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action, Executor executor);

异步执行参数指定的动作。

public CompletionStage handle(BiFunction<? super T, Throwable, ? extends U> fn);

当该计算阶段正常结束或异常结束后,都会调用参数fn指定的函数。最后返回一个新的CompletionStage

public CompletionStage handleAsync(BiFunction<? super T, Throwable, ? extends U> fn);

当该计算阶段正常结束或异常结束后,都会调用参数fn指定的函数,函数是异步执行的。最后返回一个新的CompletionStage

public CompletionStage handleAsync(BiFunction<? super T, Throwable, ? extends U> fn, Executor executor);

当该计算阶段正常结束或异常结束后,都会调用参数fn指定的函数,函数是在调用者提供的线程池中执行的。最后返回一个新的CompletionStage

public CompletableFuture toCompletableFuture();

CompletableFuture

1
2
3
public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
....
}

CompletableFuture可以作为一个显示设置计算结果的Future,并可以作为一个CompletionStage,在该计算完成时触发依赖该计算的计算或动作。

CompletableFuture 创建

有很多种方式来创建一个CompletableFuture,

public CompletableFuture() {}

public static CompletableFuture supplyAsync(Supplier supplier)

由参数supplier异步创建一个。内部使用ForkJoin框架来执行。

public static CompletableFuture supplyAsync(Supplier supplier,Executor executor)

由参数supplier异步创建一个。使用参数executor指定的线程池来异步执行。

public static CompletableFuture runAsync(Runnable runnable);

由参数指定的异步任务来创建一个。

public static CompletableFuture runAsync(Runnable runnable, Executor executor);

由参数指定的异步任务来创建一个。异步任务在参数指定的线程池执行。

public static CompletableFuture completedFuture(U value);

创建一个已经完成的CompletableFuture

完成 CompletableFuture

public boolean complete(T value)

使用参数指定的值完成 CompletableFuture

public boolean completeExceptionally(Throwable ex)

使用参数指定的异常值完成 CompletableFuture

文章目录
  1. 1. 背景
  2. 2. CompletionStage
    1. 2.1. public CompletionStage thenApply(Function<? super T,? extends U> fn);
    2. 2.2. public CompletionStage thenApplyAsync(Function<? super T,? extends U> fn);
    3. 2.3. public CompletionStage thenApplyAsync(Function<? super T,? extends U> fn, Executor executor);
    4. 2.4. public CompletionStage thenAccept(Consumer<? super T> action);
    5. 2.5. public CompletionStage thenAcceptAsync(Consumer<? super T> action);
    6. 2.6. public CompletionStage thenAcceptAsync(Consumer<? super T> action, Executor executor);
    7. 2.7. public CompletionStage thenRun(Runnable action);
    8. 2.8. public CompletionStage thenRunAsync(Runnable action);
    9. 2.9. public CompletionStage thenRunAsync(Runnable action, Executor executor);
    10. 2.10. public CompletionStage thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn);
    11. 2.11. public CompletionStage thenCombineAsync(CompletionStage<? extends U> other,
    12. 2.12. public CompletionStage thenCombineAsync(CompletionStage<? extends U> other,
    13. 2.13. public CompletionStage thenAcceptBoth(CompletionStage<? extends U> other,
    14. 2.14. public CompletionStage thenAcceptBothAsync(CompletionStage<? extends U> other,
    15. 2.15. public CompletionStage thenAcceptBothAsync(CompletionStage<? extends U> other,
    16. 2.16. public CompletionStage runAfterBoth(CompletionStage<?> other, Runnable action);
    17. 2.17. public CompletionStage runAfterBothAsync(CompletionStage<?> other,Runnable action);
    18. 2.18. public CompletionStage runAfterBothAsync(CompletionStage<?> other, Runnable action,
    19. 2.19. public CompletionStage applyToEither(CompletionStage<? extends T> other,
    20. 2.20. public CompletionStage applyToEitherAsync(CompletionStage<? extends T> other,
    21. 2.21. public CompletionStage applyToEitherAsync(CompletionStage<? extends T> other,
    22. 2.22. public CompletionStage acceptEither(CompletionStage<? extends T> other,
    23. 2.23. public CompletionStage acceptEitherAsync(CompletionStage<? extends T> other,
    24. 2.24. public CompletionStage acceptEitherAsync(CompletionStage<? extends T> other,
    25. 2.25. public CompletionStage runAfterEither(CompletionStage<?> other, Runnable action);
    26. 2.26. public CompletionStage runAfterEitherAsync(CompletionStage<?> other, Runnable action);
    27. 2.27. public CompletionStage runAfterEitherAsync(CompletionStage<?> other, Runnable action, Executor executor);
    28. 2.28. public CompletionStage thenCompose(Function<? super T, ? extends CompletionStage> fn);
    29. 2.29. public CompletionStage thenComposeAsync(Function<? super T, ? extends CompletionStage> fn);
    30. 2.30. public CompletionStage thenComposeAsync(Function<? super T, ? extends CompletionStage> fn, Executor executor);
    31. 2.31. public CompletionStage exceptionally(Function fn);
    32. 2.32. public CompletionStage whenComplete(BiConsumer<? super T, ? super Throwable> action);
    33. 2.33. public CompletionStage whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action);
    34. 2.34. public CompletionStage whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action, Executor executor);
    35. 2.35. public CompletionStage handle(BiFunction<? super T, Throwable, ? extends U> fn);
    36. 2.36. public CompletionStage handleAsync(BiFunction<? super T, Throwable, ? extends U> fn);
    37. 2.37. public CompletionStage handleAsync(BiFunction<? super T, Throwable, ? extends U> fn, Executor executor);
    38. 2.38. public CompletableFuture toCompletableFuture();
  3. 3. CompletableFuture
  4. 4. CompletableFuture 创建
    1. 4.1. public CompletableFuture() {}
    2. 4.2. public static CompletableFuture supplyAsync(Supplier supplier)
    3. 4.3. public static CompletableFuture supplyAsync(Supplier supplier,Executor executor)
    4. 4.4. public static CompletableFuture runAsync(Runnable runnable);
    5. 4.5. public static CompletableFuture runAsync(Runnable runnable, Executor executor);
    6. 4.6. public static CompletableFuture completedFuture(U value);
  5. 5. 完成 CompletableFuture
    1. 5.1. public boolean complete(T value)
    2. 5.2. public boolean completeExceptionally(Throwable ex)
|