2015-05-11 39 views
5

我需要找到一种方法将Future转换为ListenableFuture。 目前,我正在使用返回Future的服务,但我需要连接一个监听器。 我无法更改服务界面,因为它不属于我。如何将java Future <V>转换为番石榴ListenableFuture <V>

有没有简单的方法来做到这一点?

我已阅读番石榴文档,但仍然找不到办法做到这一点。

+0

你的'未来'从哪里来?它来自“ExecutorService”吗? – Will

+0

如果没有创建自己的线程有很好的方法来做到这一点,我会感到惊讶; “ListenableFuture”比“Future”强大得多。 –

+0

@我的未来来自https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/urlfetch/URLFetchService#fetchAsync(com.google.appengine.api.urlfetch。的HTTPRequest)。我找不到从gae/j异步获取网址的更好方法。 – justatester

回答

14

Guava为此转换提供JdkFutureAdapters类型。 API状态

使用提供普通文库的库所需的实用程序 未来的实例。

例如

Future<?> future = ...; 
ListenableFuture<?> listenable = JdkFutureAdapters.listenInPoolThread(future); 

但是,您应该谨慎使用:它很难模仿,当你已经已提交的任务可收听到的未来,因为没有办法上挂上了钩在那里完成,所以Guava需要一个新的线程并阻止,直到原始Future完成。

Guava Wiki也contains some information on this specific case

+0

@qwwdfsad确定。我没有看到。我会试一试。 – justatester