个性化阅读
专注于IT技术分析

什么是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;
}
}

输出:

Java中的CompletableFuture

CompletableFuture的异常处理

考虑下图, 它代表了五个CF:

Java中的CompletableFuture

假设有五个CF正在执行且CF21引发异常, 则所有从属CF(CF31和CF41)均出错。这意味着:

  • 调用isCompletedExceptionally()方法将返回true。
  • 对get()的调用将引发ExecutionException, 该异常会导致根Exception。

考虑下图, 其中我们创建了CF30, 但有一个例外。

Java中的CompletableFuture

当CF21正常执行时, CF30仅发送该值。如果引发异常, 则CF30对其进行处理并为CF31生成值。

有三种方法可以处理异常:

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);

赞(0)
未经允许不得转载:srcmini » 什么是CompletableFuture?

评论 抢沙发

评论前必须登录!