前置知识
JDK 1.5 新增了 Future 接口,用于描述异步计算的接口。其主功能如下所示:
// 尝试停止当前任务的执行,如果任务已完成、已被取消或由于某些其他原因无法取消,则此尝试将失败。
boolean cancel(boolean mayInterruptIfRunning);
// 如果此任务在正常完成之前被取消,则返回 ture。
boolean isCancelled();
// 如果此任务完成,则返回 ture
boolean isDone();
// 等待计算完成,然后检索其结果。
V get() throws InterruptedException, ExecutionException;
// 最多等待给定时间以完成计算,然后检索其结果
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
通过查看源码可以得出 Future 用于获取异步结果的方法较少:
- 通过调用 get 方法去获取异步结果,但是这样会造成阻塞。还有就是使用设置超时时间的 get 方法去获取异步结果。
- 使用轮询调用 isDone 方法,确认线程是否已经执行完成然后再去获取异步结果。
以上两种方式都有其缺点,一种是会造成阻塞,而另一种会耗费无谓的CPU资源,而且也不见得能及时地得到计算结果。这两种方式有违异步编程的初衷。
在 JDK 1.8 的时候新出了 CompletableFuture 接口,其作为 Future 的扩展。提供了函数式编程能力,简化了异步编程的复杂性,通过回调的方式处理计算结果,并提供了完善的异常处理手段。默认依靠fork/join框架启动新的线程实现异步与并发。
类架构说明:
CompletableFuture 即实现了 Future 接口又实现了 CompletionStage 接口,而其 CompletionStage 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段,有些类似Linux系统的管道分隔符传参数。
标签:异步,get,接口,boolean,CompletableFuture,Future From: https://www.cnblogs.com/lhnstart/p/16644825.html