【问题标题】:How responsive is Guava's ListenableFutureGuava 的 ListenableFuture 响应速度如何
【发布时间】:2021-04-08 18:02:34
【问题描述】:

ListenableFuture 如何检查结果是否准备就绪,以便注册的侦听器可以立即或尽快执行?

ListenableFuture 是否忙着通过调用isDone() 等待(我想这是一个愚蠢的解决方案)?或者它是否有内部任务定期调用get(long timeout, TimeUnit unit) 并带有一些微调的超时值?如果它定期唤醒以调用get(long timeout, TimeUnit unit),是否有一个参数供用户调整此行为,因为我希望我的侦听器在结果可用时立即执行。

任何文档或源代码引用将不胜感激,以进一步理解这一点。

【问题讨论】:

  • @Paul:感谢您的链接,但很难看到它是如何实现的。您是否有特定的文件/行可以链接到完成检查?

标签: java guava


【解决方案1】:

这是即时的。

没有单独的线程忙于等待。 Guava 返回的所有ListenableFuture 实例或其提供的ListeningExecutorService 都是AbstractFuture 的子类,并在有结果时调用setset 本身调用了一个名为complete 的方法,该方法将ListenableFuture 上的侦听器提交给它们关联的Executor

也就是说,不能保证附加到侦听器的Executor 会立即运行侦听器作业。这由您来确保,或者如果您希望它同步运行并且您的侦听器速度很快并且您可以阻止它,您可以使用MoreExecutors.directExecutor()

【讨论】:

  • ListenableFuture 如何首先获得set 方法的result?我很想看看这个过程是否是即时的。
  • 设置结果逻辑是否由 JVM 和 OS 控制以安排未来的某种回调?这超出了 ListenableFuture 的控制范围吗?
  • 不,不是。它在 ListenableFuture 的创建方式中定义。 setListenableFuture实现 的一部分。
  • "ListenableFuture 是如何首先得到 set 方法的结果的呢?"你有它倒退:set 方法是 ListenableFuture 首先有任何结果的方式。
  • 因此,从最终用户的角度来看,ListenableFuture 是否具有响应性并不取决于它。这仅取决于将结果设置到 ListenableFuture 的速度。那么什么过程决定何时将结果设置为 ListenableFuture ?这个过程有响应吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2015-06-02
  • 2023-03-31
  • 2010-11-12
  • 2022-08-17
  • 1970-01-01
  • 2019-01-13
相关资源
最近更新 更多