Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用番石榴的期货价格?_Java_Guava_Future - Fatal编程技术网

Java 使用番石榴的期货价格?

Java 使用番石榴的期货价格?,java,guava,future,Java,Guava,Future,最近,我一直在广泛地使用Google Guava和ListenableFutures,我发现缺少的是一种提供未来完成的无序流处理程序的方法。我所设想的是一个iterable,它会阻塞next(),直到另一个未来返回 在我努力创造我自己之前,有没有一个已经存在 如果不是,我的想法是利用ListenableFuture的回调功能将结果推送到BlockingQueue。目标是在返回值返回后立即处理它们Futures.successfulAsList()很好,但是在返回之前等待所有值,而不是让我安排其他

最近,我一直在广泛地使用Google Guava和ListenableFutures,我发现缺少的是一种提供未来完成的无序流处理程序的方法。我所设想的是一个iterable,它会阻塞next(),直到另一个未来返回

在我努力创造我自己之前,有没有一个已经存在

如果不是,我的想法是利用ListenableFuture的回调功能将结果推送到BlockingQueue。目标是在返回值返回后立即处理它们
Futures.successfulAsList()
很好,但是在返回之前等待所有值,而不是让我安排其他有用的工作。

我认为您可以使用:

  • 创建一个新的
    列表
    值-与输入值相同的数字
  • 保留一个计数器“到目前为止已经完成了多少个期货”
  • 对于每个输入未来,添加一个侦听器,以便在未来完成时,它递增计数器并为列表中的相应项设置该值(或错误)
  • 将列表返回给调用者

这是一个与输入序列相对应的未来序列,但是按照输入完成的顺序。然后调用方可以迭代列表,等待每个列表依次完成。

您可以使用
java.util.concurrent.CompletionService
。它的方法
take
可以很容易地包装到
Iterator.next()
中,如果它没有抛出
InterruptedException

的话,这绝对是正确的方法。(Guava已经考虑并拒绝了,
Iterator
s可能会失败,futures肯定会失败——但是
CompletionService
可以很好地处理OP的需求。)这确实很聪明,但CompletionService似乎是一个更好的选择(尽管我希望使用Guava解决方案)。非常感谢。