当通过 ListenableFutre 时界面,它在文档中指出
addListener()
Registers a listener to be run on the given executor. The listener will run when the
Future
's computation is complete or, if the computation is already complete, immediately.`
由于 Future.get()
是一个阻塞调用,Java 如何保证某些 future 已完成?他们在旋转这个吗?我知道使用像 Dagger 生产者这样的框架,这很容易理解(一旦任务完成,写一些东西,监控线程就会收到通知)。在 ListenableFuture 的情况下,jvm 是否支持开箱即用的东西?
使用 wait()/notify()
之类的机制?
跟进问题:正如你们所有人所说,调用者实际上保证监听器运行,正常情况下使用 ListenableFuture
将是 ListenableFuture future = Caller.call()
,调用者和被调用者在不同的线程甚至不同的 JVM 中,这是如何在 java 中完成的?监听器存储在调用者线程和被调用者线程中?或者在不同的 JVM 中使用远程注册表?
最佳答案
ListenableFuture
没有什么神奇之处 - 接口(interface)的契约只要求任何实现在完成时调用任何已注册的监听器(或立即,如果已经完成)。
看一个这样的实现可能会有所帮助,AbstractFuture
——具体看.complete()
method ,在 future 变为“完成”(通过完成、失败或被取消)后立即调用。为了既快速又线程安全,细节有些复杂,但基本上就是这样。
关于java - Java如何保证ListenableFuture中future.isDone()时回调被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317120/