Поток Java wait () => заблокирован? - PullRequest
9 голосов
/ 28 марта 2010

Согласно Информация о состоянии потока Java вызов wait () приведет к переходу потока в состояние BLOCKED. Однако этот фрагмент кода приведет (после вызова) к потоку в состоянии ожидания.

class bThread extends Thread {
    public synchronized void run() {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Я что-то не так понял? Кто-нибудь может объяснить мне это поведение? Любая помощь будет оценена!

Ответы [ 6 ]

15 голосов
/ 28 марта 2010

Тема находится в ОЖИДАНИИ, пока не получит уведомление. Затем он становится заблокированным, пытаясь повторно войти в синхронизированную область, пока все остальные потоки не уйдут.

Соответствующие детали по размещенной вами ссылке (о ОЖИДАНИИ):

Например, поток, вызвавший Object.wait () для объекта, ожидает, пока другой поток вызовет Object.notify () или Object.notifyAll () для этого объекта.

и (около БЛОКИРОВАН):

Поток в заблокированном состоянии ожидает блокировки монитора, чтобы [...] повторно войти в синхронизированный блок / метод после вызова Object.wait.

Последняя часть происходит, когда поток пытается вернуться из wait (), но не до тех пор.

9 голосов
/ 28 марта 2010

Монитор выполняет один поток за раз. Предполагая, что у вас есть потоки T1-T10, 9 являются BLOCKED, а один - RUNNABLE. Время от времени монитор выбирает новый поток для запуска. Когда это происходит, выбранный / текущий поток, скажем, T1, изменяется от RUNNABLE до BLOCKED. Затем другой поток, скажем, T2, переходит от BLOCKED к RUNNABLE, становясь текущим потоком.

Когда одному из потоков требуется предоставить информацию другим потоком, вы используете wait(). В этом случае поток будет помечен как WAITING, пока не будет notify() ed. Таким образом, ожидающий поток не будет выполняться монитором до тех пор. Например, подождите, пока появятся ящики для выгрузки. Парень, загружающий коробки, уведомит меня, когда это произойдет.

Другими словами, BLOCKED и WAITING являются статусом неактивных потоков, но поток WAITING не может быть RUNNABLE без перехода к BLOCKED в первую очередь. WAITING потоки "не хотят" становиться активными, тогда как BLOCKED потоки "хотят", но не могут, потому что это не их очередь.

Я думаю.

3 голосов
/ 28 марта 2010

Где вы видели, что говорят такие вещи?

На той же странице, на которую вы ссылались, thread.state , там четко указано, что

Ожидание будет после Object.wait ()

BLOCKED будет перед входом синхронизирован

1 голос
/ 29 октября 2012

Здесь происходит некоторая запутанная терминология. Когда поток вызывает wait для объекта, он переходит в состояние WAIT. Когда потоки ожидают для захвата блокировки, они принадлежат к wait , установленному для этой блокировки, но они находятся в состоянии BLOCKED.

Смущает, но как-то это имеет смысл!

1 голос
/ 28 марта 2010

Ожидание - это когда он вообще ничего не делает. Заблокирован, когда он пытается снова запустить работу, но ему пока не разрешено.

0 голосов
/ 29 марта 2010

Так же, как напоминание, вы всегда должны вызывать wait () внутри цикла while, ожидающего условие для входа в синхронизированный регион / критическую секцию. Это потому, что в Java есть «ложные пробуждения» (по сути, поток может пробуждаться в любой момент без всякой причины).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...