1. 背景

1.1. 同步VS异步

1.1.1. 同步

Synchronous

同步任务创建后, 调用方等待调用结果返回.

1.1.2. 异步

异步任务创建后立即返回, 任务完成后通知或者回调调用方.

1.2. Future<V>

Future

1.2.2. 缺点

  • 缺少结果通知机制

  • 缺少异常通知机制

  • 难以协调多个异步任务

1.3. ListenableFuture

ListenableFuture

1.3.1. 代码示例

ListenableFutureDemo

完善了异步任务完成和异常情况下的回调处理, 但仍然难以协调多个异步任务.

1.4. CompletableFuture

CompletableFuture

CompletableFutureFuture 进行了扩展, 提供了一大批创建/编排/组合异步任务的方法, 同时支持异常回调, 在一定程度上解决了回调地狱的问题.

2. 使用介绍

2.1. 创建CompletableFuture

  • public static CompletableFuture runAsync(Runnable)

  • public static CompletableFuture supplyAsync(Supplier)

  • public static CompletableFuture completedFuture(U)

runAsync

2.2. 获取任务状态

  • boolean isDone()

  • boolean isCompletedExceptionally()

  • boolean isCancelled()

2.3. 获取任务结果

  • T get()

  • T get(long, TimeUnit)

  • T getNow(T)

  • void join()

2.4. CompletionStage方法模板

CompletionStage 一共包含 \$14xx3+1\$个方法.

  • CompletionStage somethingAsync(…​, Executor); 由指定的线程池执行任务.

  • CompletionStage somethingAsync(…​);ForJoinPool 或者新建线程执行任务.

  • CompletionStage something(…​); 由调用方线程执行任务.

  • CompletableFuture<T> toCompletableFuture();

异步任务通过 lambda 函数接口抽象出来:

  • Apply: Function, BiFunction

  • Accept: Consumer, BiConsumer

  • Run: Runnable

2.5. 链接(1→1)

  • thenApply(Function);

  • thenAccept(Consumer);

  • thenRun(Runnable);

thenAccept

2.6. 转换(2→1)

and
  • thenCombine(CompletionStage, BiFunction);

  • thenAcceptBoth(CompletionStage, BiConsumer);

  • runAfterBoth(CompletionStage, Runnable);

or
  • applyToEither(CompletionStage, Function);

  • acceptEither(CompletionStage, Consumer);

  • runAfterEither(CompletionStage, Runnable);

异步任务组装
  • CompletionStage thenCompose(Function);

2.7. 异常处理

  • handle(BiFunction<T, Throwable, U>); 异常处理/任务结果转换

  • whenComplete(BiConsumer<T, Throwable>); 异常处理/任务结果处理

  • exceptionally(Function<Throwable, T>); 异常处理/自定义任务结果

  • exceptionallyCompose(Function<Throwable, CompletionStage>); 异常处理/组装新的异步任务

exceptionally
场景 handle whenComplete exceptionally(Compose)

任务成功后回调

x

任务异常后回调

异常后能返回自定义的任务结果

x

异常后能返回新的任务结果类型

x

x

2.8. 超时处理

  • CompletableFuture orTimeout(long, TimeUnit) 到达超时时间后取消任务

  • CompletableFuture completeOnTimeout(T, long, TimeUnit) 到达超时时间后返回自定义的任务结果

completeOnTimeout

2.9. allOf

  • public static CompletableFuture allOf(CompletableFuture…​)

allOf

2.10. anyOf

  • public static CompletableFuture anyOf(CompletableFuture…​)

3. 常见问题

4. 原理介绍

5. 总结

  • 丰富的异步任务API, 覆盖链式任务, 组合任务等场景.

  • 命令式操纵异步线程.

  • 异常处理.