Чтобы сделать obj.wait()
и obj.notify()
, вам необходимо иметь монитор объекта, о котором вы собираетесь ожидать / уведомить.В вашем коде вы, вероятно, не хотите thread1.notify ().Пример:
Object someSharedObject = ...
Тема 1:
synchronized(someSharedObject) {
// while NOT if for spurious wake ups.
while(!conditionFullfiled) someSharedObject.wait();
}
Тема 2:
synchronized(someSharedObject) {
if(conditionFullfiled) someSharedObject.notify(); // this wakes thread1
}
Блокировка synchronized
включена someSharedObject
(может быть this
)Это означает, что два потока никогда не будут конфликтовать..wait()
освобождает текущий удерживаемый монитор, поэтому Thread2 не будет блокироваться, когда Thread1 ожидает.
Редактировать: Я кое-что узнал о ложных пробуждениях..wait()
должно быть выполнено в цикле while
- if
недостаточно. Почему потоки самопроизвольно просыпаются от wait ()? .Спасибо Энно Сиоджи за то, что научил меня.
Редактировать: Уточнено .wait()
выпускает монитор.