4

最近,我一直在与 Google Guava 和 ListenableFutures 进行广泛的合作,而我一直发现缺少的东西是一种提供未来完成的乱序流处理程序的方法。我所设想的是一个可迭代的,它在next()上阻塞,直到另一个未来返回。

在我努力创建自己的之前,是否已经存在一个?

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

4

2 回答 2

7

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

于 2012-09-03T19:27:03.387 回答
1

认为您可以使用与.NET 相同的技巧Task<T>

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

现在是与输入序列相对应的期货序列,但按输入完成的顺序排列。然后调用者可以遍历列表,等待每个列表依次完成。

于 2012-09-03T16:52:36.440 回答