Поток Java ожидает () => заблокированный?

Согласно Java ожидает вызов информации о состоянии потока (), закончится поток для входа в ЗАБЛОКИРОВАННОЕ состояние. Однако эта часть кода закончится (после того, чтобы быть названным) в Потоке в состоянии ОЖИДАНИЯ.

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

}

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

9
задан Gray 27 April 2013 в 16:01
поделиться

5 ответов

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

Соответствующие части из опубликованной вами ссылки (о WAITING):

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

и (о BLOCKED):

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

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

15
ответ дан 4 December 2019 в 07:34
поделиться

Монитор выполняет по одному потоку за раз. Предполагая, что у вас есть потоки T1-T10, 9 из них ЗАБЛОКИРОВАНЫ , а один - РАБОТАЮЩИЙ . Время от времени монитор выбирает новый поток для запуска. Когда это происходит, выбранный / текущий поток, скажем, T1, переходит с RUNNABLE на BLOCKED . Затем другой поток, скажем, T2, переходит от BLOCKED к RUNNABLE , становясь текущим потоком.

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

Другими словами, как BLOCKED , так и WAITING являются статусами неактивных потоков, но поток WAITING не может быть RUNNABLE без перехода на ЗАБЛОКИРОВАНО сначала. WAITING потоки «не хотят» становиться активными, тогда как BLOCKED потоки «хотят», но не могут, потому что это не их очередь.

Думаю.

9
ответ дан 4 December 2019 в 07:34
поделиться

Где вы видели, чтобы там говорилось что-то подобное?

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

WAITING будет после Object.wait()

BLOCKED будет до входа в синхронизацию

3
ответ дан 4 December 2019 в 07:34
поделиться

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

1
ответ дан 4 December 2019 в 07:34
поделиться

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

0
ответ дан 4 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: