РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1057 of 1163 menu

Метод invokeAny

Метод invokeAny класса ExecutorService принимает коллекцию задач Callable, выполняет их параллельно и возвращает результат первой задачи, которая успешно завершилась. Как только одна из задач завершается, все остальные незавершенные задачи отменяются. В первый параметр мы передаем коллекцию задач Callable, во второй (необязательный) - таймаут, а в третий (необязательный) - единицу измерения времени. Если ни одна задача не завершится успешно, метод выбросит исключение ExecutionException. При превышении таймаута выбрасывается TimeoutException.

Синтаксис

<T> T invokeAny(Collection<? extends Callable<T>> tasks) <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

Пример

Давайте запустим три задачи и получим результат первой успешно завершившейся:

import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newFixedThreadPool(3); List<java.util.concurrent.Callable<String>> tasks = List.of( () -> { Thread.sleep(300); return "abcde"; }, () -> { Thread.sleep(100); return "12345"; }, () -> { Thread.sleep(200); return "hello"; } ); String res = executor.invokeAny(tasks); System.out.println(res); executor.shutdown(); } }

Результат выполнения кода:

"12345"

Пример

Давайте зададим таймаут в 1 секунду. Если ни одна задача не успеет завершиться, будет выброшено исключение TimeoutException:

import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newFixedThreadPool(3); List<java.util.concurrent.Callable<String>> tasks = List.of( () -> { Thread.sleep(3000); return "abcde"; }, () -> { Thread.sleep(4000); return "12345"; } ); try { String res = executor.invokeAny(tasks, 1, TimeUnit.SECONDS); System.out.println(res); } catch (java.util.concurrent.TimeoutException e) { System.out.println("Timeout"); } executor.shutdown(); } }

Результат выполнения кода:

"Timeout"

Смотрите также

  • класс ExecutorService,
    который управляет пулом потоков
  • метод invokeAll,
    который выполняет все задачи и возвращает их результаты
  • метод submit,
    который отправляет одну задачу на выполнение
  • метод shutdown,
    который завершает работу исполнителя
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить