首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未来与未来的区别

未来与未来的区别
EN

Stack Overflow用户
提问于 2019-01-17 15:07:00
回答 2查看 5.3K关注 0票数 14

在(Java)反应性编程中,Future和(工程堆) Mono之间有什么区别?这两种方法似乎都是将来计算完成时访问异步计算结果的方法。如果Mono已经完成了工作,为什么要引入Future接口呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-23 13:09:13

最大的区别是Mono<T>可以完全懒惰,而当您获得一个Future<T>时,底层处理已经开始。

对于典型的冷Mono,只有对其进行subscribe()才会发生任何事情,这使得在应用程序中传递Mono并在开始处理之前通过操作符丰富Mono成为可能。

Mono相比,使用Future保持异步性也要容易得多(在Future中,API倾向于驱动您调用阻塞get())。

最后,与FutureCompletableFuture相比,Mono的合成方面得到了改进,提供了丰富的运算符词汇量。

票数 14
EN

Stack Overflow用户

发布于 2019-01-17 16:02:18

生产者和使用者可以通过两种方式进行通信:同步和异步。

在同步(基于拉的方式)中,使用者是一个线程,并且使用一些中间通信器对象.通常是阻塞队列。在特殊情况下,当在整个生产者-消费者通信过程中只传递单个值时,可以使用实现接口Future的通信器。这种方式被称为同步,因为使用者调用像Future.get()这样的通信方法,方法等待直到值可用,然后作为结果返回该值。也就是说,请求和接收值是在同一个语句中编写的,尽管这些操作可以在时间上分开。

同步通信的缺点是当使用者等待所请求的值时,它会为其线程堆栈浪费大量的内存。因此,我们只能有数量有限的等待数据的操作。例如,它可以是为多个客户端服务的互联网连接。为了增加这个数目,我们可以使用生产者或通信器调用的方法来表示使用者,而不是一个线程,而是一些相对较小的对象。这种方式称为异步。它分为两个操作:请求生产者传递数据和将数据传递给使用者。这是异步(基于推送的)方法。

现在,对这个问题的回答是:Future只能充当同步通信器(使用get方法),Mono既可以用作同步通信器(使用block方法),也可以用作异步通信器(使用subscribe方法)。

请注意,java.util.concurrent.CompletableFuture还可以充当同步和异步通信程序。为什么要有同样的方法去做同样的事情呢?这种现象叫做不是这里发明的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54238755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档