2012-09-03 3 views
4

В последнее время я активно работаю с Google Guava и ListenableFutures, и кое-что, что мне не хватало, - это способ обеспечить обработчик потокового потока будущих заказов. То, что я представляю, - это итерируемый, который блокирует на next(), пока не вернется другое будущее.Итерабельность фьючерсов с использованием Guava?

Прежде чем я попытаюсь создать свое собственное, существует ли уже существующее?

Если нет, я думал о том, чтобы использовать функцию обратного вызова ListenableFuture для вывода результатов на BlockingQueue. Цель состоит в том, чтобы обработать возвращаемые значения, как только они вернутся. Futures.successfulAsList() отлично, но ждет всех значений перед возвратом, а не позволяет мне планировать другую полезную работу.

ответ

7

Вы можете использовать java.util.concurrent.CompletionService. Его метод take можно легко обернуть до Iterator.next(), если он не выбрасывает InterruptedException.

+0

Это, безусловно, путь. (Гува рассмотрел и отклонил, имея «Итератор», который может потерпеть неудачу, какие фьючерсы определенно могут, но «CompletionService» прекрасно справляется с потребностями OP). –

1

Я думаю вы могли бы использовать the same trick I've looked at with .NET's Task<T>:

  • Создать новый List<SettableFuture<T>> значения - такое же количество, как входные фьючерсы
  • Держите счетчик «сколько фьючерсов завершили до сих пор»
  • Для каждого входного фьючерса добавьте слушатель так, чтобы при завершении будущего он увеличил счетчик и установил это значение (или ошибку) для соответствующего элемента в списке
  • Retu rn список вызывающему абоненту

Это теперь последовательность фьючерсов, соответствующих входной последовательности, но в том порядке, в котором заканчиваются входы. Затем вызывающий абонент может перебирать список, ожидая завершения каждого из них.

+1

Это действительно умно, но CompletionService кажется лучшим выбором (несмотря на мое желание использовать решение Guava). Спасибо! – Xorlev

Смежные вопросы