Java 使用番石榴的期货价格?
最近,我一直在广泛地使用Google Guava和ListenableFutures,我发现缺少的是一种提供未来完成的无序流处理程序的方法。我所设想的是一个iterable,它会阻塞next(),直到另一个未来返回 在我努力创造我自己之前,有没有一个已经存在 如果不是,我的想法是利用ListenableFuture的回调功能将结果推送到BlockingQueue。目标是在返回值返回后立即处理它们Java 使用番石榴的期货价格?,java,guava,future,Java,Guava,Future,最近,我一直在广泛地使用Google Guava和ListenableFutures,我发现缺少的是一种提供未来完成的无序流处理程序的方法。我所设想的是一个iterable,它会阻塞next(),直到另一个未来返回 在我努力创造我自己之前,有没有一个已经存在 如果不是,我的想法是利用ListenableFuture的回调功能将结果推送到BlockingQueue。目标是在返回值返回后立即处理它们Futures.successfulAsList()很好,但是在返回之前等待所有值,而不是让我安排其他
Futures.successfulAsList()
很好,但是在返回之前等待所有值,而不是让我安排其他有用的工作。我认为您可以使用:
- 创建一个新的
值-与输入值相同的数字列表
- 保留一个计数器“到目前为止已经完成了多少个期货”
- 对于每个输入未来,添加一个侦听器,以便在未来完成时,它递增计数器并为列表中的相应项设置该值(或错误)
- 将列表返回给调用者
这是一个与输入序列相对应的未来序列,但是按照输入完成的顺序。然后调用方可以迭代列表,等待每个列表依次完成。您可以使用
java.util.concurrent.CompletionService
。它的方法take
可以很容易地包装到Iterator.next()
中,如果它没有抛出InterruptedException
的话,这绝对是正确的方法。(Guava已经考虑并拒绝了,Iterator
s可能会失败,futures肯定会失败——但是CompletionService
可以很好地处理OP的需求。)这确实很聪明,但CompletionService似乎是一个更好的选择(尽管我希望使用Guava解决方案)。非常感谢。