Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpExIy 177 of 322 menu
◀ ▶

Конкурентный выбор готовой задачи в Java

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

invokeAny запускает все Callable из коллекции и блокирует вызов, пока одна из них не завершится нормально. Остальные задачи обычно отменяют, чтобы не тратить ресурсы:

import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) throws Exception { ExecutorService pool = Executors.newFixedThreadPool(3); List<Callable<String>> mirrors = List.of( () -> { Thread.sleep(120); return "slow"; }, () -> { Thread.sleep(20); return "fast"; }, () -> { Thread.sleep(80); return "mid"; } ); String winner = pool.invokeAny(mirrors); System.out.println(winner); pool.shutdown(); } }

На экране fast: средняя и медленная задачи не доходят до чтения результата в этом примере. Если каждая попытка бросает исключение, invokeAny завершится ExecutionException с агрегированной причиной.

Метод не подходит, когда нужны все ответы: для полного набора есть invokeAll. invokeAny выбирают для резервирования и ускорения за счёт параллельных дубликатов одного запроса.

Создайте три Callable, возвращающие разные строки после паузы 100, 10 и 50 мс. Выведите строку, которую вернёт invokeAny.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить