2017-01-24 7 views
-1

При каких условиях это может случиться?Какие циркуляции могут привести к передаче потока из очереди ожидания в заблокированную очередь?

Насколько я знаю

Blocked очередь является буфером между потоками производства предметов потребления и объектов.

Очередь ожидания предотвращает конфликты потоков для одной и той же блокировки.

Таким образом, поток получает блокировку, но не может быть передан потребителю, поскольку он теперь занят?

+1

Эти две вещи не связаны друг с другом. 'BlockingQueues' содержат объекты, а не потоки. Темы, которые читаются и записываются из/в очередь, не передаются ему. – Kayaman

+2

Возможный дубликат [Разница между состояниями WAIT и BLOCKED] (http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states) –

+0

Вы должны проверить этот вопрос: http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states –

ответ

1

вопрос имеет смысл только при условии, что это на самом деле означает «Какие обстоятельства могут вызвать нить изменения из 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.