Чтобы сделать 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
. Why do threads spontaneously awake from wait()?. Спасибо Энно Шиодзи за то, что вы меня учили.
Редактировать: Уточненный .wait()
релизы монитор.
`if` следует заменить` while` на справиться с ложными пробуждениями. – 2010-11-28 12:38:03