java - Java如何保证ListenableFuture中future.isDone()时回调被调用

标签 java asynchronous guava

当通过 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/

相关文章:

JavaFX - 如何获取 Controller 对象的实例

Java:动态填充数组(不是 vector/ArrayList)

c# - 聚合匿名类型的任务

java - Google Guava 与 Apache Commons

java - 向 Guava ImmutableList 添加和删除项目

java - Guava:如何输入通用枚举的幂集列表

java - 从 ant build.xml 文件构建 gradle 任务时并发修改异常

java - JNA - 读取多个按键

android - 如何通过udp发送传感器值

java - Java EE 中的异步执行