Эти методы определены у класса Object
и предназначены для взаимодействия потоков между собой при межпоточной синхронизации.
wait()
: освобождает монитор и переводит вызывающий поток в состояние ожидания до тех пор, пока другой поток не вызовет методnotify()
/notifyAll()
;notify()
: продолжает работу потока, у которого ранее был вызван методwait()
;notifyAll()
: возобновляет работу всех потоков, у которых ранее был вызван методwait()
.
Когда вызван метод wait()
, поток освобождает блокировку на объекте и переходит из состояния Работающий (Running) в состояние Ожидания (Waiting). Метод notify()
подаёт сигнал одному из потоков, ожидающих на объекте, чтобы перейти в состояние Работоспособный (Runnable). При этом невозможно определить, какой из ожидающих потоков должен стать работоспособным. Метод notifyAll()
заставляет все ожидающие потоки для объекта вернуться в состояние Работоспособный (Runnable). Если ни один поток не находится в ожидании на методе wait()
, то при вызове notify()
или notifyAll()
ничего не происходит.
Поток может вызвать методы wait()
или notify()
для определённого объекта, только если он в данный момент имеет блокировку на этот объект. wait()
, notify()
и notifyAll()
должны вызываться только из синхронизированного кода.