С Использование потоков в приложениях J2ME. Автор Eric Giguere :
Монитор поддерживает очередь ожидающих потоков, позволяя только одному потоку одновременно входить в блок.
Поскольку каждый объект Java может выступать в качестве монитора, класс java.lang.Object определяет три метода, которые предоставляют эту базовую функциональность: wait (), notify () и notifyAll (). Любой поток может приостановить себя, вызвав метод wait () объекта:
...
Object obj = .... // some object to use as a lock
synchronized( obj ){
// here is where you'd check obj's state
try {
obj.wait();
}
catch( InterruptedException e ){
}
}
...
Поток должен заблокировать объект перед вызовом его метода wait (). Он также должен перехватывать исключение java.lang.InterruptedException и соответствующим образом обрабатывать прерывания потоков. Поток неявно освобождает свою блокировку для объекта после того, как он приостанавливает себя.
Метод wait () перегружен: поток может указать необязательный тайм-аут в миллисекундах, если не хочет ждать бесконечно.
Как только поток приостанавливает себя, другой поток освобождает его, вызывая метод notify () или notifyAll () того же объекта:
...
Object obj = .... // same object used as lock!
synchronized( obj ){
obj.notify(); // or notifyAll
}
...
Опять же, второй поток должен заблокировать объект перед вызовом notify () или notifyAll (). Эти два метода ведут себя одинаково, за исключением того, что один пробуждает один ожидающий поток, а другой пробуждает все ожидающие потоки. Порядок пробуждения потоков не указан. Каждый вновь пробудившийся поток должен повторно получить свою блокировку на объекте, прежде чем он сможет фактически продолжаться, потому что его блокировка на объект была неявно снята, когда он приостановил себя.