概念梳理
基础概念
正如我们将在后续章节中看到的那样,我们选择称其为“概念”,其确切定义往往会有所不同。我们将从对
- completed/determined:计算完毕,可以获得值。
- incomplete/undetermined:计算还在进行中。
稍后我们将看到,在
The construct (future X) immediately returns a future for the value of the expression X and concurrently begins evaluating X.When the evaluation of X yields a value, that value replaces the future.
- (Halstead, 1985)
源起与应用
作为相关主题的
-
Request-Response Patterns,例如通过
HTTP 的网络服务调用。Futures 可以用来表示HTTP 请求的响应值。 -
Input/Output,例如需要用户输入的
UI 对话框,或例如从磁盘读取大文件的操作。Futures 可以用来表示IO 调用和IO 的结果值(例如,终端输入,已读取文件的字节数组) 。 -
Long-Running Computations,想象一下,您希望启动长时间运行的计算(例如复杂的数值算法)的过程不要等待该长时间运行的计算完成,而是继续处理其他任务。未来可能会用来表示这种长期运行的计算及其结果的价值。
-
Database Queries,像长时间运行的计算一样,数据库查询可能很耗时。因此,像上面一样,可能希望将执行查询的工作转移到另一个进程,然后继续处理下一个任务。
Futures 可以用来表示查询和查询的结果值。 -
RPC (Remote Procedure Call),当对服务器进行
RPC 调用时,网络延迟通常是一个问题。像上面一样,可能希望不必等待RPC 调用的结果,而只需将其卸载到另一个进程即可。Futures 可以用来表示RPC 调用及其结果。当服务器响应结果时,Futures 就完成了,其价值就是服务器的响应。 -
Reading Data from a Socket 可能由于网络延迟而非常耗时。因此,可能希望不必等待传入的数据,而是将其卸载到另一个进程。Futures 可以用来表示读取操作以及Futures 完成时读取的结果值。 -
Timeouts,例如管理
Web 服务中的超时。表示超时的Future 可能只返回没有结果或某种空结果,例如类型化编程语言中的Unit 类型。
今天,许多现实世界中的服务和系统都在诸如此类的流行环境中大量使用
相似概念
Future 是对于那些尚待计算的值的只读引用。Promise 或CompletableFuture 或Completer 是与Future 关联的单赋值对象。
简单来说,
A future is a placeholder object for a result that does not yet exist.A promise is a writable, single-assignment container, which completes a future.Promises can complete the future with a result to indicate success, or with an exception to indicate failure.
CompletableFutures
视为一个CompletableFuture
还实现了 Future
接口,使其也可以用作 Future
。使用公共设置方法可以将
在Task<T>
,TaskCompletionSource<T>
。Task<T>.Result
,TaskCompletionSource<T>.Task<TResult>
则包含了完成 Task
对象或者抛出异常的方法。
(Promises/A+, 2013)
规范紧急定义了接口而将具体的实现留给了各个标准。
简史
如下的时间轴是对于

最终导致
A piece of coding which provides an address
(Ingerman, 1961)
更详细的