发布于 2019-01-23 13:09:13
最大的区别是Mono<T>可以完全懒惰,而当您获得一个Future<T>时,底层处理已经开始。
对于典型的冷Mono,只有对其进行subscribe()才会发生任何事情,这使得在应用程序中传递Mono并在开始处理之前通过操作符丰富Mono成为可能。
与Mono相比,使用Future保持异步性也要容易得多(在Future中,API倾向于驱动您调用阻塞get())。
最后,与Future和CompletableFuture相比,Mono的合成方面得到了改进,提供了丰富的运算符词汇量。
发布于 2019-01-17 16:02:18
生产者和使用者可以通过两种方式进行通信:同步和异步。
在同步(基于拉的方式)中,使用者是一个线程,并且使用一些中间通信器对象.通常是阻塞队列。在特殊情况下,当在整个生产者-消费者通信过程中只传递单个值时,可以使用实现接口Future的通信器。这种方式被称为同步,因为使用者调用像Future.get()这样的通信方法,方法等待直到值可用,然后作为结果返回该值。也就是说,请求和接收值是在同一个语句中编写的,尽管这些操作可以在时间上分开。
同步通信的缺点是当使用者等待所请求的值时,它会为其线程堆栈浪费大量的内存。因此,我们只能有数量有限的等待数据的操作。例如,它可以是为多个客户端服务的互联网连接。为了增加这个数目,我们可以使用生产者或通信器调用的方法来表示使用者,而不是一个线程,而是一些相对较小的对象。这种方式称为异步。它分为两个操作:请求生产者传递数据和将数据传递给使用者。这是异步(基于推送的)方法。
现在,对这个问题的回答是:Future只能充当同步通信器(使用get方法),Mono既可以用作同步通信器(使用block方法),也可以用作异步通信器(使用subscribe方法)。
请注意,java.util.concurrent.CompletableFuture还可以充当同步和异步通信程序。为什么要有同样的方法去做同样的事情呢?这种现象叫做不是这里发明的。
https://stackoverflow.com/questions/54238755
复制相似问题