本文概述
- 完成阶段
- 未来与可完成的未来
- 未来的局限性
- 创建一个CompletableFuture
- CompletableFuture的异常处理
这样, 主线程不会阻塞或等待任务完成。其他任务并行执行。并行可以提高程序的性能。
CompletableFuture是Java中的类。它属于java.util.cocurrent包。它实现了CompletionStage和Future接口。
完成阶段
- 它执行一个动作并在另一个完成阶段完成时返回一个值。
- 可能触发其他任务的任务模型。
当多个线程尝试完成时-异常完成或取消CompletableFuture时, 只有其中一个成功。
未来与可完成的未来 CompletableFuture是Java 8中引入的Java Future API的扩展。
Future用于异步编程。它提供了两种方法, isDone()和get()。该方法在完成时检索计算结果。
未来的局限性
- 未来不能相互完成。
- 如果不加限制, 我们将无法对Future的结果采取进一步的行动。
- Future没有任何异常处理。
- 我们不能合并多个期货。
创建一个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。
文章图片
当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);
推荐阅读
- Java中的ClassLoader
- Java中的ArrayIndexOutOfBoundsException
- 从Oracle数据库检索图像的示例
- Android开发——diglog cancel与dismiss方法区别
- CSAPP 3e: Bomb lab (phase_4)
- 上传到App Store时5.5寸图和iPad pro图报错
- 酷划锁屏手机赚钱APP的使用经验分享
- 如何导出android内部存储的文件(不用root)
- Android开发——Toast知识