线程异步编排串行(CompletableFuture)

Posted 伍妖捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程异步编排串行(CompletableFuture)相关的知识,希望对你有一定的参考价值。

美图

在这里插入图片描述

创建异步对象

CompletableFuture提供了四个静态方法来创建一个异步操作

无返回值

  • 不需要指定线程池,使用默认线程池
CompletableFuture<Void> runAsync(Runnable runnable);
  • 需要指定线程池,使用指定线程池
CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)

有返回

  • 不需要指定线程池,使用默认线程池
CompletableFuture<U> supplyAsync(Supplier<U> supplier)
  • 需要指定线程池,使用指定线程池
CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)

示例

CompletableFuture.runAsync(() -> System.out.println("runAsync"));
Integer integer = CompletableFuture.supplyAsync(() -> 100).get();

线程执行之后的回调

在上个线程中继续执行下一步操作

CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action)

在另一个空闲线程中继续执行下一步操作,默认线程池

CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action)

在另一个空闲线程中继续执行下一步操作,指定线程池

CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action, Executor executor)

只处理异常结果

CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn)

示例

Integer integer = CompletableFuture.supplyAsync(() -> 100)
                .whenCompleteAsync((res, throwable) -> {
                    if (throwable == null) {
                        System.out.println("成功的之后的下一步业务");
                    } else {
                        System.out.println("失败的之后的下一步业务");
                    }
                }).get();

出现异常的时候,返回默认值

Integer integer = CompletableFuture.supplyAsync(() -> 100/0)
                .exceptionally(throwable -> 10).get();

handle方法

可以对执行之后的结果做修改

CompletableFuture<U> handle(BiFunction<? super T, Throwable, ? extends U> fn)
CompletableFuture<U> handleAsync(BiFunction<? super T, Throwable, ? extends U> fn) 
CompletableFuture<U> handleAsync(BiFunction<? super T, Throwable, ? extends U> fn, Executor executor)

线程串行化方法

thenRun

不需要获取上一步执行结果,上一步执行完成,接着执行,无返回值

CompletableFuture<Void> thenRun(Runnable action)
CompletableFuture<Void> thenRunAsync(Runnable action)
CompletableFuture<Void> thenRunAsync(Runnable action, Executor executor)

thenAccept

需要获取上一步执行结果,上一步执行完成,接着执行,无返回值

CompletableFuture<Void> thenAccept(Consumer<? super T> action)
CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> action)
CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> action, Executor executor)

需要获取上一步执行结果,上一步执行完成,接着执行,有返回值

CompletableFuture<U> thenApply(Function<? super T,? extends U> fn)
CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn) 
CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor)

以上是关于线程异步编排串行(CompletableFuture)的主要内容,如果未能解决你的问题,请参考以下文章

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture 异步编排

Java异步编排结合线程池实现多任务按需执行案例

面试官:五年开发连异步编程CompletableFuture都不会