Выбор ответа Senior java.util.concurrent и виртуальные потоки обновлено

Пул виртуальных потоков

Вопрос

Нужно ограничить число одновременных запросов к внешнему API до 20. Код работает на виртуальных потоках. Что сделать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Использовать Semaphore(20) вокруг вызова. Виртуальные потоки дешёвые, их не пулят, а ограничение доступа к ресурсу выражают явно семафором.

Варианты ответа

  1. Создать Executors.newFixedThreadPool(20) из виртуальных потоков
  2. Использовать Semaphore(20) вокруг вызоваправильный ответ
  3. Поставить -Djdk.virtualThreadScheduler.parallelism=20
  4. Ничего: виртуальные потоки сами ограничивают параллелизм

Разбор

Виртуальные потоки дешёвые, их не пулят, а ограничение доступа к ресурсу выражают явно семафором. Пул из 20 виртуальных потоков формально возможен, но смешивает две задачи и противоречит модели «поток на задачу». Параметр parallelism ограничивает носители, то есть CPU-параллелизм, а не число ждущих I/O запросов. Сами по себе виртуальные потоки ничего не ограничивают.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме