Я думаю, вы неправильно поняли, что "блокируется" в BlockingQueue
.
Вызов queue.take()
блокирует поток, который его вызвал, до тех пор, пока что-то не станет доступным в очереди.Это означает, что поток будет ждать там бесконечно, если не будет прерван, до тех пор, пока элемент не будет добавлен в очередь.
Второй пример кода приводит к зависанию проблемы, поскольку вы добавляете 20 задач, ожидающих появления элемента вBlockingQueue
, и исполнитель имеет только 5 потоков - таким образом, первые пять задач приводят к блокировке всех пяти потоков.Этот исполнитель заполнен еще 15 потребительскими задачами.
Добавление задач во второй цикл for для добавления элементов в очередь приводит к 20 задачам, которые никогда не могут быть выполнены, поскольку все потоки в исполнителе застряли в ожидании.
Так что, когдавы говорите так:
Согласно моему пониманию, take () приводит к освобождению потока, даже если само задание заблокировано на take ().
У вас естьнедоразумение, потому что здесь нет разницы между тем, что делает «нить», и тем, что делает «задача».Поток не может быть «освобожден», пока задача заблокирована - это поток, который запускает задачу.Когда поток сталкивается с блокирующим вызовом take()
, поток блокируется, точка.