什么是CompletableFuture()

本文概述

  • 完成阶段
  • 未来与可完成的未来
  • 未来的局限性
  • 创建一个CompletableFuture
  • CompletableFuture的异常处理
CompltableFuture用于异步编程。异步编程意味着编写非阻塞代码。它在与主应用程序线程不同的线程上运行任务, 并向主线程通知其进度, 完成或失败。
这样, 主线程不会阻塞或等待任务完成。其他任务并行执行。并行可以提高程序的性能。
CompletableFuture是Java中的类。它属于java.util.cocurrent包。它实现了CompletionStage和Future接口。
完成阶段
  • 它执行一个动作并在另一个完成阶段完成时返回一个值。
  • 可能触发其他任务的任务模型。
因此, 它是一条链的元素。
当多个线程尝试完成时-异常完成或取消CompletableFuture时, 只有其中一个成功。
未来与可完成的未来 CompletableFuture是Java 8中引入的Java Future API的扩展。
Future用于异步编程。它提供了两种方法, isDone()和get()。该方法在完成时检索计算结果。
未来的局限性
  • 未来不能相互完成。
  • 如果不加限制, 我们将无法对Future的结果采取进一步的行动。
  • Future没有任何异常处理。
  • 我们不能合并多个期货。
未来有很多限制, 这就是我们拥有CompletableFuture的原因。 CompletableFuture提供了用于创建多个期货, 链接和组合的多种方法。它还具有全面的异常处理支持。
创建一个CompletableFuture 我们只能使用以下无参数构造函数来创建CompletableFuture。
CompletableFuture< String> CompletableFuture = new CompletableFuture< String> ();


最常用的CompletableFuture方法是:
  • supplyAsync():它异步完成其工作。默认情况下, 供应商的结果由ForkJoinPool.commonPool()中的任务运行。 supplyAsync()方法返回CompletableFuture, 我们可以在其上应用其他方法。
  • thenApply():该方法接受函数作为参数。当此阶段正常完成时, 它将返回一个新的CompletableStage。新阶段用作所提供函数的参数。
  • join():方法完成后返回结果值。如果异常完成, 它还会抛出CompletionException(未经检查的异常)。
import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 {public static void main(String[] args) {try{List< Integer> list = Arrays.asList(5, 9, 14); list.stream().map(num-> CompletableFuture.supplyAsync(()-> getNumber(num))).map(CompletableFuture-> CompletableFuture.thenApply(n-> n*n)).map(t-> t.join()).forEach(s-> System.out.println(s)); }catch (Exception e){e.printStackTrace(); }}private static int getNumber(int a){return a*a; }}

输出:
什么是CompletableFuture()

文章图片
CompletableFuture的异常处理 考虑下图, 它代表了五个CF:
什么是CompletableFuture()

文章图片
假设有五个CF正在执行且CF21引发异常, 则所有从属CF(CF31和CF41)均出错。这意味着:
  • 调用isCompletedExceptionally()方法将返回true。
  • 对get()的调用将引发ExecutionException, 该异常会导致根Exception。
考虑下图, 其中我们创建了CF30, 但有一个例外。
什么是CompletableFuture()

文章图片
当CF21正常执行时, CF30仅发送该值。如果引发异常, 则CF30对其进行处理并为CF31生成值。
【什么是CompletableFuture()】有三种方法可以处理异常:
public CompletableFuture < T> exceptionally(Function < Throwable, ? extends T> function); public < U> CompletableFuture< U> hadle(BiFunction< ? super T, Throwable, ? extends U> bifunction); public CompletableFuture< T> whenComplete(BiConsumer< ? super T, ? super Throwable> action);

    推荐阅读