gpt4 book ai didi

java - future 和 promise 有什么区别?

转载 作者:bug小助手 更新时间:2023-10-28 10:41:43 25 4
gpt4 key购买 nike

FuturePromise 有什么区别?
它们都充当 future 结果的占位符,但主要区别在哪里?

最佳答案

(到目前为止,我对答案并不完全满意,所以这是我的尝试......)

我认为 Kevin Wright's comment

You can make a Promise and it's up to you to keep it. When someone else makes you a promise you must wait to see if they honour it in the Future

总结得很好,但一些解释可能很有用。

Futures and promises是非常相似的概念,不同之处在于 Future 是一个只读容器,用于存储尚不存在的结果,而 Promise 可以写入(通常只写一次)。 Java 8 CompletableFuture 和 Guava SettableFuture可以认为是 Promise,因为它们的值可以设置(“完成”),但它们也实现了 Future 接口(interface),因此对客户端没有区别。

future 的结果将由“其他人”设置 - 由异步计算的结果。注意 FutureTask - 一个经典的 future - 必须使用 Callable 或 Runnable 进行初始化,没有无参数的构造函数,Future 和 FutureTask 从外部都是只读的(FutureTask 的 set 方法受到保护) .该值将设置为内部计算的结果。

另一方面,promise 的结果可以由“你”(或者实际上任何人)随时设置,因为它有一个公共(public)的 setter 方法。 CompletableFuture 和 SettableFuture 都可以在没有任何任务的情况下创建,并且可以随时设置它们的值。您向客户端代码发送一个 promise ,并在以后如您所愿地履行它。

请注意,CompletableFuture 不是“纯”promise,它可以像 FutureTask 一样使用任务进行初始化,其最有用的功能是处理步骤的不相关链接。

还要注意,promise 不必是 future 的子类型,也不必是同一个对象。在 Scala 中,Future 对象由异步计算或 不同 Promise 对象创建。在 C++ 中情况类似:promise 对象由生产者使用,future 对象由消费者使用。这种分离的好处是客户端无法设置 future 的值。

两者SpringEJB 3.1有一个 AsyncResult 类,类似于 Scala/C++ promise 。 AsyncResult 确实实现了 Future 但这不是真正的 future :Spring/EJB 中的异步方法通过一些背景魔法返回一个不同的只读 Future 对象,客户端可以使用第二个“真实” future 来访问结果。

关于java - future 和 promise 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com