Выбор ответа Senior java.util.concurrent и виртуальные потоки обновлено
Пул виртуальных потоков
Вопрос
Нужно ограничить число одновременных запросов к внешнему API до 20. Код работает на виртуальных потоках. Что сделать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Использовать Semaphore(20) вокруг вызова. Виртуальные потоки дешёвые, их не пулят, а ограничение доступа к ресурсу выражают явно семафором.
Варианты ответа
- Создать
Executors.newFixedThreadPool(20)из виртуальных потоков - Использовать
Semaphore(20)вокруг вызоваправильный ответ - Поставить
-Djdk.virtualThreadScheduler.parallelism=20 - Ничего: виртуальные потоки сами ограничивают параллелизм
Разбор
Виртуальные потоки дешёвые, их не пулят, а ограничение доступа к ресурсу выражают явно семафором. Пул из 20 виртуальных потоков формально возможен, но смешивает две задачи и противоречит модели «поток на задачу». Параметр parallelism ограничивает носители, то есть CPU-параллелизм, а не число ждущих I/O запросов. Сами по себе виртуальные потоки ничего не ограничивают.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- null в ConcurrentHashMap
- CompletableFuture без executor
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier