Future 和 Promise 是非常相似的概念,不同之处在于,Future 是针对尚不存在的结果的只读容器,而 Promise 可以被写入(通常只能写入一次)。可以将Java 8 CompletableFuture和SettableFuture视为 Promise,因为可以设置它们的值,但是它们也实现了Future接口,因此对于客户端而已它们没什么区别。
Future 的结果由异步计算的结果确定。请注意,必须使用Callable或Runnable初始化FutureTask(经典的Future),没有无参数构造函数,并且Future和FutureTask都是从外部只读的(FutureTask的set方法受保护)。该值将从内部设置为计算结果。
另一方面,Promise 的结果可以由你(或实际上任何人)随时设置,因为它具有公共设置方法。可以创建CompletableFuture和SettableFuture,而无需执行任何任务,并且可以随时设置它们的值。你向客户代码发送一个 Promise,并在以后根据需要执行。注意,CompletableFuture不是“纯粹的”Promise,可以使用诸如FutureTask之类的任务对其进行初始化,并且它最有用的功能是与处理链的步骤无关。
总结:
Promise最终被称为CompletableFuture,在Java 8中,它的javadoc解释了:可以明确完成(设置其值和状态)并可以用作CompletionStage的Future,它支持在完成时触发的相关功能和操作。
原文地址: https://www.zhblog.net/go/java/tutorial/java-netty-difference-future-promise?t=604