вопрос имеет смысл только при условии, что это на самом деле означает «Какие обстоятельства могут вызвать нить изменения из wait
состояния в blocked
состояние?»
Там может быть особенно реализация планировщика, поддерживающая эти потоки в выделенной очереди, вынуждена перемещать потоки из одной очереди в другую при этих изменениях состояния и влиять на набор разума того, кто изначально сформулировал вопрос, но такой вопрос не должен быть загружен с предполагаемыми деталями реализации. В качестве побочной заметки, когда очередь из runnable
потоков имела смысл, я не могу представить себе настоящую причину, чтобы поставить потоки blocked
или waiting
в (глобальную) очередь.
Если это первоначальное намерение вопроса, его не следует путать с классами Java, реализующими очереди и имеющими похожие имена зондирования.
Поток находится в blocked
состоянии, если он пытается ввести synchronized
метод или код фрагмента, а другой поток владеет монитор объекта. Оттуда поток превратится в runnable
состояние, если владелец выпускает монитор и блокированный поток преуспевает в приобретении монитора
Поток находится в waiting
состояния, если выполняет явное действие, которое может только продолжить, если другие thread выполняет связанное действие, то есть если поток вызывает wait
на объект, он может действовать только тогда, когда другой поток вызывает notify
на том же объекте. Если поток вызывает LockSupport.park()
, другой поток должен вызывать LockSupport.unpark()
с этим потоком в качестве аргумента. Когда он вызывает join
в другом потоке, этот поток должен завершить его выполнение, чтобы закончить ожидание. Состояние waiting
также может заканчиваться из-за ошибки или spuriuos wakeups.
В качестве частного случая Java рассматривает потоки в состоянии timed_waiting
, если они вызвали упомянутые выше методы с таймаутом или когда он выполняет Thread.sleep
. Это состояние отличается от состояния waiting
тем, что состояние также может завершиться из-за прошедшего времени.
Когда поток вызывает wait
на объекте, он должен владеть монитором объекта, т.е. быть внутри метода synchronized
или кодового блока. Монитор снимается по этому вызову и повторно возвращается при возврате. Когда он не может быть немедленно восстановлен, поток будет переходить из состояния waiting
или timed_waiting
в состояние blocked
.
Эти две вещи не связаны друг с другом. 'BlockingQueues' содержат объекты, а не потоки. Темы, которые читаются и записываются из/в очередь, не передаются ему. – Kayaman
Возможный дубликат [Разница между состояниями WAIT и BLOCKED] (http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states) –
Вы должны проверить этот вопрос: http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states –