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

Запуск списка задач целиком в Java

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

Метод invokeAll блокирует вызывающий поток, пока все задачи из коллекции не закончат работу или не будут отменены. Возвращаемый список Future обычно совпадает по порядку с исходной коллекцией:

import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Main { public static void main(String[] args) throws Exception { ExecutorService pool = Executors.newFixedThreadPool(2); List<Callable<String>> batch = List.of( () -> "alpha", () -> { Thread.sleep(30); return "beta"; }, () -> "gamma" ); List<Future<String>> done = pool.invokeAll(batch); for (Future<String> slot : done) { System.out.println(slot.get()); } pool.shutdown(); } }

Печать идёт в порядке alpha, beta, gamma, даже если средняя задача дольше остальных: invokeAll сначала дожидается полного набора, и только потом выход из метода.

Есть перегрузка с таймаутом: по истечении времени метод возвращает список, но часть задач может остаться незавершённой. Такую форму используют, когда общий дедлайн важнее полного комплекта ответов.

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