Параллельные поручения пулу в Java
Каталог отдаёт цены трёх поставщиков независимо друг от друга. Ждать их строго по очереди в одном потоке долго, а три отдельных запроса через пул позволяют считать данные параллельно в пределах размера пула.
Каждая постановка возвращает свою Future. Порядок
завершения может не совпадать с порядком отправки, поэтому
результаты связывают с задачей через переменную или список
ссылок:
import java.util.ArrayList;
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(3);
List<Future<Integer>> pending = new ArrayList<>();
for (int n = 1; n <= 3; n++) {
int value = n * 10;
Callable<Integer> task = () -> {
Thread.sleep(50);
return value;
};
pending.add(pool.submit(task));
}
List<Integer> answers = new ArrayList<>();
for (Future<Integer> slot : pending) {
answers.add(slot.get());
}
pool.shutdown();
System.out.println(answers);
}
}
Список ответов сохраняет порядок обхода Future,
а не порядок фактического окончания sleep. Так проще
сопоставить результат с исходным параметром задачи.
Если пул меньше, чем задач, часть поручений подождёт в
очереди, но логика сбора через список ссылок остаётся
той же. Альтернатива одному циклу get() -
пакетные методы пула, они в следующих уроках.
В пул из 2 потоков поставьте четыре задачи,
каждая возвращает квадрат своего номера 1..4.
Соберите ответы в список и выведите его одной строкой.