Что такое пул потоков (Thread Pool) в Java и как его создать?

«Что такое пул потоков (Thread Pool) в Java и как его создать?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пул потоков (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 для настройки создаваемых потоков (имена, приоритеты, демоны).