Поток Java wait() => заблокирован?

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

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

}

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

Я думаю.

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

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

ОЖИДАНИЕ будет после Object.wait ()

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

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

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

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

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

Другие вопросы по тегам