本文概述
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的异常处理
考虑下图, 它代表了五个CF:
假设有五个CF正在执行且CF21引发异常, 则所有从属CF(CF31和CF41)均出错。这意味着:
- 调用isCompletedExceptionally()方法将返回true。
- 对get()的调用将引发ExecutionException, 该异常会导致根Exception。
考虑下图, 其中我们创建了CF30, 但有一个例外。
当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);
评论前必须登录!
注册