Ответ
Пул потоков (Thread Pool) — это набор предсозданных потоков, готовых к выполнению задач. Вместо создания нового потока для каждой задачи, пул переиспользует существующие, что снижает накладные расходы и упрощает управление параллелизмом.
Основной интерфейс — ExecutorService.
Пример создания через Executors:
// 1. Фиксированный пул
ExecutorService fixedPool = Executors.newFixedThreadPool(4);
// 2. Кэширующий пул (создаёт потоки по мере необходимости)
ExecutorService cachedPool = Executors.newCachedThreadPool();
// 3. Пул с одним потоком (последовательное выполнение)
ExecutorService singleThread = Executors.newSingleThreadExecutor();
// 4. Отправка задачи в пул
fixedPool.submit(() -> {
System.out.println("Задача выполняется в " + Thread.currentThread().getName());
});
// 5. Корректное завершение работы пула
fixedPool.shutdown(); // Остановка после выполнения всех задач
// fixedPool.shutdownNow(); // Попытка немедленной остановки
Прямое создание ThreadPoolExecutor (больше контроля):
int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 60L;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue
);
Преимущества:
- Снижение затрат на создание/уничтожение потоков.
- Ограничение количества одновременно работающих потоков.
- Управление очередью задач.
Важные моменты:
- Всегда завершайте пул (
shutdown()). - Выбор типа пула и его параметров зависит от характера задач (CPU-bound, I/O-bound).
- Используйте
ThreadFactoryдля настройки создаваемых потоков (имена, приоритеты, демоны).