Java8异步编程类CompletableFuture使用

一、了解Future

CompletedFuture实现了Future接口,自Java 1.5以来有Future接口,Future类表示异步计算的未来结果,这个结果最终将在处理完成后出现在Future中。Future.isDone()方法用来检查计算是否完成,Future.get()获取计算完成返回结果,请注意,此方法会阻止执行,直到任务完成。Future.cancel(boolean)告诉执行程序停止操作并中断其底层线程。

执行结果

上面的例子虽然可以异步执行任务,但是却不能优雅的获取结果,只能是用阻塞或者轮询的方式来获取任务结果。轮询加阻塞,总是给人一种怪怪的感觉。

所以,在Java 8中, 新增加了一个包含50个方法左右的类: CompletableFuture,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。

二、 CompletableFuture 类介绍

2.1 创建 CompletableFuture

2.1.1 可以使用简单的构造方法

2.1.2 使用静态方法

2.2 获取计算结果

保留了原有的get()和get(long timeout, TimeUnit unit)方法,另外还新增了

get(long timeout, TimeUnit unit)表示只在限定时间内等待获取结果,超时就抛出异常。

getNow(T valueIfAbsent)表示如果已经计算完就立马返回结果或者抛出异常,否则就返回预设的valueIfAbsent。

join()也是用来获取返回的结果,如果有异常就抛出一个unchecked异常( CompletionException ),它和get()抛出的异常不一样,可以分别运行一下下面两行代码

第一张图是get()的结果,第二张图是join()的结果

2.3 计算完成后的动作处理

当CompletableFuture的计算结果完成,或者抛出异常的时候,我们可以执行特定的Action。主要是下面的方法:

带Async的方法,说明是以新的线程池运行,而具体是不是新的线程池,那就要看这里指定的线程池是不是和创建CompletableFuture时指定的一样,另外,如果是同一个线程池,也有可能被同一个线程选中。

一个简单的示例

2.4 计算结果转换

有的时候我们需要直接将计算的结果A类转换为B类。CompletableFuture由于是回调风格,我们可以不必阻塞的告诉CompletableFuture当计算完成的时候请执行某个function。而且我们还可以将这些操作串联起来,或者将CompletableFuture组合起来。

看一下转换方法有哪些

看下这个例子

2.5 纯消费执行

上面的方法是当计算完成的时候,会生成新的计算结果(thenApply, handle),或者返回同样的计算结果whenComplete,CompletableFuture还提供了一种处理结果的方法,只对结果执行Action,而不返回新的计算值,因此计算值为Void:

示例

0

《Java8异步编程类CompletableFuture使用》有一个想法

发表评论

邮箱地址不会被公开。