未来与单声道之间的区别

时间:2019-01-17 15:07:00

标签: java reactive-programming future project-reactor

在(Java)反应式编程中,Linux apps on Chrome OS: An easy-to-follow guide和(Future<T>Project Reactor有什么区别?两者似乎都是将来在计算完成时一次访问异步计算结果的手段。如果已经完成Mono的工作,为什么还要引入Future接口呢?

2 个答案:

答案 0 :(得分:2)

最大的区别是Mono<T>可以完全惰性,而当您握住Future<T>时,基础处理已经开始。

使用典型的感冒Mono,直到您subscribe()都不会发生任何事情,这使得可以在应用程序中传递Mono并在操作过程中使操作员充实它,甚至没有开始处理。

Mono(使用API​​往往会促使您调用阻塞的Future)相比,使用get()保持事物异步也容易得多。

最后,与FutureCompletableFuture相比,Mono的构图方面有了改进,它提供了丰富的运算符。

答案 1 :(得分:0)

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

以同步(基于拉)的方式,使用者是线程,并且使用了一些中间通信对象。通常它是一个阻塞队列。在特殊情况下,如果在整个生产者-消费者通信期间仅传递单个值,则可以使用实现接口Future的通信器。这种方式称为同步,因为使用者调用了类似Future.get()之类的通信方法,并且该方法会等到该值可用后再返回该值。也就是说,尽管可以在时间上将这些动作分开,但在同一条语句中对请求值和接收值进行了编程。

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

现在,对该问题的答复是:Future仅能够用作同步通信器(使用get方法),并且Mono既可以用作同步通信器(具有block方法)和作为异步方法(与subscribe方法)。

请注意,java.util.concurrent.CompletableFuture也可以充当同步和异步通信器。为什么要用类似的手段做同样的事情?这种现象称为not invented here