Сцены ожидания
Типичная сцена ожидания обычно связана со следующими двумя содержимыми:
1. Установить переменную
Когда потоки нужно ждать, это всегда вызвано некоторыми условиями. Например, заполнение очереди, когда элемент очереди заполнен, поток должен прекратить работу. Когда элементы очереди вакантны, продолжайте свое собственное исполнение.
2. Состояние предикат
Когда поток определяется, следует ли входить в ожидание или проснуться от уведомления, необходимо проверить, соответствуют ли условия состояния. Например, добавление элементов в очередь, очередь полна, поэтому он блокирует текущий поток. нить." В настоящее время процесс ожидания элемента будет пробужден, а затем судите, есть ли место для текущей очереди. Следующий Wake -Up.
3. Очередь состояния
Каждый объект имеет встроенную очередь условия.
Уведомление
Подождите и уведомление являются важной частью механизма синхронизации Java. В сочетании с использованием синхронизированных ключевых слов можно создать много превосходных синхронных моделей, таких как модель производителя-потребителя. Но при использовании функции function (), notify (), notifyall () функция, вам необходимо обратить особое внимание на следующие моменты:
WAIT (), notify (), Methods () () Методы не принадлежат к классу потоков, но принадлежат классу Object Foundation, то есть каждый объект имеет функции wait (), notify () и notify (). Поскольку каждый объект заблокирован, блокировка является основой каждого объекта, поэтому метод работы блокировки также является самым основным.
Вызовите obj's wait () и notify () метод, вы должны получить блокировку OBJ, то есть вы должны быть записаны в сегменте кода Synchronized (OBJ) {...}.
После вызова obj.wait (), потока A выпускает блокировку OBJ, в противном случае поток B не может получить блокировку OBJ, и он не сможет разбудить поток A в синхронизированном (OBJ) {...} Код сегмент.
Когда метод obj.wait () возвращается, поток A необходимо получить блокировку OBJ снова для продолжения выполнения.
Если потоки A1, A2, A3 находятся в obj.wait (), нить B вызывает obj.notify () может разбудить только одну из потоков A1, A2, A3 (который определяется JVM).
Если поток B вызывает obj.notifyall (), он все может разбудить резьбу для ожидания A1, A2, A3, но поток ожидания, который продолжит выполнять следующее предложение Obj.wait (), вы должны получить блокировку OBJ. Поэтому потоки A1, A2, A3 имеют только один шанс получить замки и продолжать выполнять, например, A1, остальные должны ждать, пока A1 выпустит блокировку OBJ, прежде чем продолжить выполнение.
Когда поток B вызывает obj.notify () или obj.notifyall (), нить B удерживает блокировку OBJ. До тех пор, пока поток B не выходит на синхронизированный кодовый блок и не выпустит блокировку OBJ, один в потоке A1, A2, A3 имеет возможность получить блокировку объекта и продолжать выполнять.
Например, код
Типичная структура кода операции ожидания потока заключается в следующем:
public void test () Throws urpruptedException {synchronized (obj) {while (! contidition) {obj.wait ();}}}}}}}}}
Почему операции obj.wait () должны быть расположены в цикле? Есть несколько основных причин:
1. Замок объекта может использоваться для защиты нескольких переменных состояния. Например, определенный объект блокирует OBJ для защиты двух переменных статуса A и B. Когда условия утверждения не установлены, операция ожидания происходит. Теперь, если происходит операция состояния A, операция уведомления вызывает OBJ, то все потоки в очереди, соответствующем OBJ, пробуждаются. Для B также пробуждается в это время, поэтому вам нужно переработать, будет ли соответствовать условию B для выполнения.
2. Условия одного и того же состояния нескольких потоков утверждаются. Например, сцена добавления элементов в очередь, текущая очередь полна, и несколько потоков хотят добавить элементы внутри, так что они все. В настоящее время другой поток взял элемент из очереди и назвал операцию notifyall, чтобы разбудить все потоки, но только один поток может добавить элемент в очередь.
3. Ложно пробуждение. Без уведомления, прерывание или, поток был автоматически пробужден. Хотя эта ситуация редко возникает на практике, эта ситуация может быть устранена за счет ожидания цикла.