未来与单声道的区别

Difference between a Future and a Mono

提问人:Raedwald 提问时间:1/17/2019 最后编辑:Raedwald 更新时间:5/25/2019 访问量:7065

问:

在(Java)反应式编程中,Future<T>和(Project ReactorMono<T>有什么区别?两者似乎都是在计算完成时访问异步计算结果的方法。如果已经完成了这项工作,为什么要引入接口?MonoFuture

Java 响应式编程 未来 项目反应器

评论

2赞 Thomas 1/17/2019
也许这会有所帮助:spring.io/blog/2016/04/19/understanding-reactive-types(“java 反应式单声道与未来”的第一个结果)。

答:

3赞 Alexei Kaigorodov 1/18/2019 #1

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

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

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

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

请注意,它还可以充当同步和异步通信器。为什么要用类似的手段来做同样的事情?这种现象在这里被称为不是发明的。java.util.concurrent.CompletableFuture

15赞 Simon Baslé 1/23/2019 #2

最大的区别是 a 可以完全懒惰,而当你掌握 a 时,底层处理已经开始。Mono<T>Future<T>

对于典型的感冒,在你遇到它之前什么都不会发生,这使得在开始处理之前就可以在应用程序中传递并在此过程中与操作员一起丰富它。Monosubscribe()Mono

与 相比,使用 a 保持异步也容易得多(其中 API 倾向于驱使您调用阻塞)。MonoFutureget()

最后,与两者相比,组合方面通过它提供的运算符的广泛词汇得到了改进。FutureCompletableFutureMono

评论

0赞 user2077221 10/1/2020
哎呀,没有真正的区别。据我所知,项目反应器和弹簧往往会为众所周知的概念创造新名称。没有理由不能有一个支持该方法的实现/扩展接口,其名称的含义比“1”或“Monkey”更有意义。Futuresubscribe