В чем разница между состоянием потока WAIT и состоянием потока ЗАБЛОКИРОВАНО?
Документация Thread.State :
Заблокирован.
В этом состоянии находится поток, который заблокирован в ожидании блокировки монитора.Ожидание
Поток, который бесконечно ожидает выполнения другим потоком определенного действия, находится в этом состоянии.
не объясняет мне разницу.
java
multithreading
block
wait
Более пяти
источник
источник
Ответы:
После вызова
wait()
объекта поток переходит в состояние ожидания . Это называется состоянием ожидания . Когда поток достигает состояния ожидания, ему нужно будет дождаться вызова какого-либо другого потокаnotify()
или вызоваnotifyAll()
объекта.Как только этот поток будет уведомлен, его нельзя будет запустить. Возможно, другие потоки также уведомляются (используют
notifyAll()
) или первый поток не завершил свою работу, поэтому он все еще заблокирован, пока не получит свой шанс. Это называется заблокированным состоянием. Состояние «Заблокировано» возникает всякий раз, когда поток пытается получить блокировку объекта, а какой-либо другой поток уже удерживает блокировку.Как только другие потоки уйдут и у него появится шанс этого потока, он переходит в состояние Runnable, после чего он имеет право выполнять работу на основе механизма потоковой передачи JVM и переходит в состояние выполнения.
источник
Разница относительно проста.
В этом
BLOCKED
состоянии поток собирается войти вsynchronized
блок, но в данный момент внутриsynchronized
блока на том же объекте выполняется другой поток . Затем первый поток должен дождаться выхода второго потока из своего блока.В этом
WAITING
состоянии поток ожидает сигнала от другого потока. Обычно это происходит при вызовеObject.wait()
, илиThread.join()
. Затем поток будет оставаться в этом состоянии до тех пор, пока другой поток не вызоветObject.notify()
или не умрет.источник
Object.wait()
напрямую, но в конечном итоге вWAITING
состоянии также использовать более высокоуровневые конструкции параллелизма - такие как блокировки, блокирующие очереди и т. Д. В общем, когда два потока должны координировать свои действия.RUNNING
состоянии.Thread.State
говорится: «... Эти состояния представляют собой состояния виртуальных машин, которые не отражают состояния потоков операционной системы». Другими словами, JVM не заботится о разнице между потоком, выполняющим код Java, потоком, ожидающим возврата системного вызова, или потоком, ожидающим временного отрезка. Все этоRUNNABLE
касается JVM.WAITING
состояния, он должен сначала перейти в этоBLOCKED
состояние, пока не сможет получить блокировку, связанную с объектом, которого он ожидал.Важное различие между заблокированным состоянием и состоянием ожидания - влияние на планировщик. Поток в заблокированном состоянии борется за блокировку; этот поток по-прежнему считается чем-то, что планировщик должен обслуживать, и, возможно, учитывается в решениях планировщика о том, сколько времени дать запущенным потокам (чтобы он мог дать шанс потокам, блокирующим блокировку).
Когда поток находится в состоянии ожидания, нагрузка, которую он оказывает на систему, сводится к минимуму, и планировщику не нужно об этом беспокоиться. Он бездействует, пока не получит уведомление. За исключением того факта, что он сохраняет занятость потока ОС, он полностью не работает.
Вот почему использование notifyAll далеко не идеально, оно приводит к тому, что куча потоков, которые ранее благополучно бездействовали, не загружая систему, просыпается, где большинство из них будут блокироваться, пока не получат блокировку, найдут состояние, в котором они находятся. ожидание не соответствует действительности, и возвращайтесь к ожиданию. Было бы предпочтительнее уведомлять только те потоки, у которых есть шанс добиться прогресса.
(Использование ReentrantLock вместо внутренних блокировок позволяет вам иметь несколько условий для одной блокировки, так что вы можете убедиться, что уведомляемый поток - это тот, который ожидает определенного условия, избегая ошибки с потерянным уведомлением в случае, если поток получает уведомление для то, на что он не может воздействовать.)
источник
Упрощенная перспектива для интерпретации дампов потоков:
источник
RUNNABLE
не совсем правы. Он может находиться в очереди выполнения Java, но не выполняться, или может выполнять код Java. Это не должно быть призывом к родной земле.Заблокирован - ваш поток находится в рабочем состоянии жизненного цикла потока и пытается получить блокировку объекта. Ждите. Ваш поток находится в состоянии ожидания жизненного цикла потока и ожидает сигнала уведомления, чтобы перейти в рабочее состояние потока.
источник
см. этот пример:
демонстрация состояний потоков.
источник