Исполнители задач в Java
Сайт собирает превью, пишет метрики и отвечает клиенту.
На каждое мелкое действие заводить отдельный Thread
дорого: память под стеки, переключения планировщика и
риск «взрыва» числа потоков при пике нагрузки.
Служба исполнителя принимает задачи в очередь и
раздаёт их ограниченному набору рабочих потоков. Интерфейс
ExecutorService из java.util.concurrent
описывает такой контракт: вы описываете работу, пул
выполняет её асинхронно, а программа может заниматься
другими делами или ждать итог.
Готовые реализации создают через фабрику Executors.
Для учебных примеров и типичного сервисного кода часто
хватает фиксированного пула с двумя или четырьмя потоками:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) throws InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.execute(() -> System.out.println("background"));
pool.shutdown();
pool.awaitTermination(5, java.util.concurrent.TimeUnit.SECONDS);
}
}
Метод execute ставит Runnable в очередь
без возврата ссылки на результат. Если нужен ответ или
контроль завершения, используют submit, о нём в
следующих уроках.
В Java 27 пулы по-прежнему опираются на те же правила,
что и ручные потоки: общая куча, видимость полей и
корректное завершение при остановке приложения. Раздел
о Thread задаёт базу, здесь смотрим на удобную
обёртку для повседневной фоновой работы.