Выбор ответа Middle java.util.concurrent и виртуальные потоки спрашивают часто обновлено
Порядок действий ThreadPoolExecutor
Вопрос
В ThreadPoolExecutor core = 2, max = 4, очередь ArrayBlockingQueue(10). Сейчас работают 2 потока, в очереди 5 задач. Что произойдёт с новой задачей?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Попадёт в очередь: потоки сверх core создаются, лишь когда она полна. Логика execute: меньше core потоков, создать поток; иначе в очередь; если очередь полна, создать поток до max; иначе политика отказа.
Варианты ответа
- Попадёт в очередь: потоки сверх core создаются, лишь когда она полнаправильный ответ
- Создастся третий поток, потому что max = 4 и пул сначала растёт до max
- Задача будет отклонена политикой AbortPolicy, раз core-потоки заняты
- Выполнится в вызывающем потоке, пока в пуле нет свободных потоков
Разбор
Логика execute: меньше core потоков, создать поток; иначе в очередь; если очередь полна, создать поток до max; иначе политика отказа. Очередь заполнена на 5 из 10, поэтому задача просто встаёт в очередь. Многие ожидают, что пул сначала дорастёт до max, это частое заблуждение. Выполнение в вызывающем потоке это CallerRunsPolicy, она срабатывает только при отказе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Рекурсия в computeIfAbsent
- null в ConcurrentHashMap
- CompletableFuture без executor
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier