Метод InvokeAny

27.07.2016

Метод ExecutorService.invokeAny() добавляет коллекцию задач в объект Executor, возвращает результат первой завершившейся задачи и игнорирует все прочие. Это может пригодиться в ситуациях, когда выполняется поиск по нескольким наборам данных и при обнаружении заданного образца необходимо сразу же остановить операцию, или в любой другой ситуации, когда достаточно результата одной из задач, выполняющихся параллельно:

<Т> invokeAny( Collections extends Са11аЫе<Т» tasks )

<Т> invokeAny( Collections extends Callable> tasks, long timeout,

TimeUnit unit )

Метод invokeAnyO устанавливает блокировку до момента, когда одна из задач вернёт результат, и затем отменяет все прочие задачи вызовом future.cancel (true) для каждой. Если остальные задачи не реагируют на прерывание, они продолжат выполнение в рабочих потоках в фоновом режиме без каких-либо сообщений о результатах. Следовательно, продолжительные задачи могут давать побочные эффекты, например изменять совместно используемые переменные, даже после возврата из метода invokeAny (). По истечении времени, отведённого на выполнение, invokeAny!) снимет блокировку, но не вернет никакого результата. Необходимо зарегистрировать доменное имя? Обратитесь в компанию http://www.domenus.ru/domain/register. Здесь любую вашу идею воплотят в реальность.

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