在(Java)反应式编程中,Linux apps on Chrome OS: An easy-to-follow guide和(Future<T>
)Project Reactor有什么区别?两者似乎都是将来在计算完成时一次访问异步计算结果的手段。如果已经完成Mono
的工作,为什么还要引入Future
接口呢?
答案 0 :(得分:2)
最大的区别是Mono<T>
可以完全惰性,而当您握住Future<T>
时,基础处理已经开始。
使用典型的感冒Mono
,直到您subscribe()
都不会发生任何事情,这使得可以在应用程序中传递Mono
并在操作过程中使操作员充实它,甚至没有开始处理。
与Mono
(使用API往往会促使您调用阻塞的Future
)相比,使用get()
保持事物异步也容易得多。
最后,与Future
和CompletableFuture
相比,Mono
的构图方面有了改进,它提供了丰富的运算符。
答案 1 :(得分:0)
生产者和消费者可以通过两种方式进行通信:同步和异步。
以同步(基于拉)的方式,使用者是线程,并且使用了一些中间通信对象。通常它是一个阻塞队列。在特殊情况下,如果在整个生产者-消费者通信期间仅传递单个值,则可以使用实现接口Future
的通信器。这种方式称为同步,因为使用者调用了类似Future.get()
之类的通信方法,并且该方法会等到该值可用后再返回该值。也就是说,尽管可以在时间上将这些动作分开,但在同一条语句中对请求值和接收值进行了编程。
同步通信的缺点是,当使用者等待请求的值时,它将浪费大量的内存用于其线程堆栈。结果,我们只能等待有限数量的等待数据的动作。例如,可能是为多个客户端提供服务的Internet连接。为了增加该数量,我们可以使用生产者或通信者在消费者数据可用时调用的方法,而不是将消费者表示为线程,而是表示为一些较小的对象。这种方式称为异步。它分为两个动作:请求生产者传递数据并将该数据传递给消费者。这是异步(基于推送)方法。
现在,对该问题的答复是:Future
仅能够用作同步通信器(使用get
方法),并且Mono
既可以用作同步通信器(具有block
方法)和作为异步方法(与subscribe
方法)。
请注意,java.util.concurrent.CompletableFuture
也可以充当同步和异步通信器。为什么要用类似的手段做同样的事情?这种现象称为not invented here。