Запуск списка задач целиком в 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 сначала дожидается полного набора, и
только потом выход из метода.
Есть перегрузка с таймаутом: по истечении времени метод возвращает список, но часть задач может остаться незавершённой. Такую форму используют, когда общий дедлайн важнее полного комплекта ответов.