2013-05-14 2 views
7

Я пишу приложение на Java, которое использует ExecutorService для запуска нескольких потоков.Отслеживание завершенных задач в ExecutorService

Я хочу отправить несколько задач (в тысячах раз подряд) в Исполнитель и как это сделать, получить их результат. То, как я подхожу к этому, каждый раз, когда я вызываю функцию submit(), я получаю Будущее, которое я храню в ArrayList. Позже я передаю список в поток, который продолжает итерацию по нему, вызывая функцию future.get() с таймаутом, чтобы проверить, завершена ли задание. это правильный подход или слишком неэффективен?

EDIT --- Больше информации --- Другая проблема заключается в том, что каждый Callable занимает различное количество времени обработки. Поэтому, если я просто выберу первый элемент из списка и вызову get() на нем, он будет блокироваться, а результаты других могут стать доступными, и программа не будет знать. Вот почему мне нужно продолжать повторять таймауты.

заранее спасибо

+0

Я рекомендую вам рассмотреть утилиты ListenableFuture в библиотеке Гуава: https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained – Enwired

ответ

1

Обратите внимание, что вызов Future.get будет заблокирован до тех пор, пока не будет доступен ответ. Таким образом, вам не нужен другой поток для итерации по списку массивов.

Смотрите здесь https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6

+0

Понял. Но я отправляю тысячи задач в ExecutorService во время всплеска. Поэтому мне нужно хранить фьючерсы где-нибудь для дальнейшего использования. Пока я заблокирован в первом Callable, другой может быть завершен, и я не буду знать. Есть идеи? –

+0

Хранение их в списке в порядке. Вы дойдете до того, что закончилось, как только тот, который заблокирован, будет завершен. – Woody

+0

Хранение их в списке в порядке. Вы дойдете до того, что закончилось, как только тот, который заблокирован, будет завершен. Если вам необходимо получить уведомление о каждом завершении, когда и когда это произойдет, например. для обновления пользовательского интерфейса, тогда в общем случае вам следует использовать механизм уведомления, а не опрос. Я думаю, что Future.get - слишком общий механизм для этой цели. – Woody

6

это правильный подход или слишком неэффективно?

Это неправильный подход как таковой. Вы не нуждаетесь в повторном завершении проверки ArrayList.

Это очень просто: используйте только: CompletionService. Вы можете легко обернуть в него существующего исполнителя. Из JavaDocs:

Производители представляют задачи для выполнения. Потребители принимают завершенные задания и обрабатывают их результаты в порядке их заполнения.

В сущности, CompletionService дает возможность получить результат обратно, просто вызвав take(). Это блокирующая функция, и вызывающий блок блокируется до тех пор, пока результаты не будут доступны.