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
}
ロックは、2つのスレッドが衝突することはありませんを意味し、(this
することができます)someSharedObject
です。 .wait()
は、現在保持されているモニタを解放するため、Thread1が待機しているときにThread2はブロックされません。
編集:私は偽の目覚めについて何かを学んだ。 .wait()
はwhile
ループで完了する必要があります。ループif
では不十分です。 Why do threads spontaneously awake from wait()?。私に教えてくれてありがとうございました。
編集:明確に.wait()
がリリースされました。
http://download.oracle.com/javase/6/docs/api/ を読みます偽の起床に対処する。 –
'someSharedObject.wait();'はsynchronizedブロック内で呼び出されます。つまり、Thread1がすでに待機中であれば、他のsynchronizedブロックに入ることはありませんか? – fhucho
@fhucho、 'wait()'は現在保持しているモニタを解放します。 –