Что такое пул потоков (Thread Pool) и зачем он нужен?

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

Ответ

Пул потоков — это механизм для управления и повторного использования заранее созданных потоков, которые выполняют асинхронные задачи. Вместо создания нового потока для каждой задачи и его последующего уничтожения, задачи помещаются в очередь и выполняются доступными потоками из пула.

Основные преимущества:

  • Снижение накладных расходов: Создание и уничтожение потоков — дорогая операция. Пул переиспользует существующие потоки.
  • Контроль за ресурсами: Ограничивает максимальное количество одновременно работающих потоков, предотвращая исчерпание ресурсов системы (например, при DoS-атаке или ошибке).
  • Управление очередью задач: Задачи, которые не могут быть немедленно выполнены, ждут в очереди.

Пример создания и использования в Java (ExecutorService):

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // Создаем фиксированный пул из 4 потоков
        ExecutorService executor = Executors.newFixedThreadPool(4);

        // Отправляем 10 задач на выполнение
        for (int i = 0; i < 10; i++) {
            int taskId = i;
            executor.submit(() -> {
                System.out.println("Выполнение задачи " + taskId + " в потоке " + Thread.currentThread().getName());
            });
        }

        // Инициируем упорядоченное завершение (выполнит все задачи в очереди)
        executor.shutdown();
        try {
            // Ожидаем завершения всех задач, но не более 1 минуты
            if (!executor.awaitTermination(1, TimeUnit.MINUTES)) {
                executor.shutdownNow(); // Принудительное завершение
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
        }
    }
}

Для чего нужен: Для эффективного управления многопоточностью, повышения производительности приложений с большим количеством коротких асинхронных задач и предотвращения утечек ресурсов.