Вопрос с собеседования · Java

Почему задачи отдают в пул потоков, а не создают поток на каждую?

JuniorМногопоточность
Ещё спрашивают так:
  • Что такое ExecutorService?
  • Как выбрать размер пула потоков?
  • Какие бывают пулы потоков в Java?
  • Зачем нужен пул потоков (ExecutorService)?
Коротко

Пул переиспользует потоки и ограничивает их число: создание потока дорого, а неограниченный рост убивает приложение.

  • ExecutorService: submit задачи, Future с результатом, shutdown в конце
  • Настраивают число потоков и очередь: что делать, если задач больше, чем потоков

А ещё Размер: для CPU-задач ≈ число ядер, для ожидания I/O — больше; для I/O на Java 21 — виртуальные потоки

Подробно

Платформенный поток соответствует потоку ОС: ему нужна память под стек и работа ядра при создании и переключении. Создавать поток на каждую короткую задачу расточительно. Ещё опаснее отсутствие ограничений: при всплеске нагрузки появятся тысячи потоков, и приложение утонет в переключениях контекста и нехватке памяти.

Пул решает обе проблемы: фиксированный набор потоков берёт задачи из очереди.

Основные элементы ThreadPoolExecutor:

  • число потоков (core и max);
  • очередь задач — ограниченная или нет. Неограниченная очередь при перегрузке растёт до нехватки памяти;
  • политика отказа — что делать, если очередь полна: бросить исключение, выполнить в вызывающем потоке, отбросить.

Фабрики Executors.newFixedThreadPool(n) удобны, но используют неограниченную очередь — в продакшене часто настраивают пул явно.

Размер: для вычислительных задач — около числа ядер; для задач с ожиданием (сеть, база) — больше. Пул нужно останавливать: shutdown() и awaitTermination(), иначе приложение может не завершиться.

Пример

ExecutorService pool = Executors.newFixedThreadPool(8);
try {
    Future<Report> report = pool.submit(() -> buildReport(id));
    // ... другая работа
    Report r = report.get(5, TimeUnit.SECONDS);
} finally {
    pool.shutdown();
}

Что хотят услышать

  • Две причины: стоимость создания потоков и ограничение их числа.
  • Устройство пула: потоки, очередь, политика отказа.
  • Как выбирать размер и почему важна ограниченная очередь.
  • Остановка пула.

Частые ошибки

  • Считать, что пул сам по себе ускоряет вычисления.
  • Оставлять неограниченную очередь задач и получать переполнение памяти.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Пул выполняет задачи быстрее за счёт повышенного приоритета
  • ✗Без пула задачи выполняются последовательно
  • ✓Поток дорог, а пул переиспользует потоки и ограничивает их
  • ✗Пул гарантирует, что задачи не бросят исключений

Что спросят дальше

  • Как выбрать размер пула?
  • Что произойдёт с задачей, если все потоки заняты?
  • Чем submit отличается от execute?
  • Как подобрать размер пула?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования