オブジェクトに所有権を持たずにwait()
メソッドを呼び出すと、例外が発生することがわかりました。 とJavaドキュメントから、別のスレッド *はどちらか、彼0方法や の呼び出しによって* を覚ますために、このオブジェクトのモニターで待機中のスレッドに通知するまで*スレッド このモニタと待機のリリースの所有権をwait()
を呼び出すに* {@code notifyAll}
方法。 したがって、wait()
がオブジェクトに対して呼び出されると、その特定のスレッドは、他のスレッドがそれを通知するまで、そのオブジェクトのオブジェクトの所有権を失います。wait()を複数回呼び出しても例外がスローされないのはなぜですか?
wait()
を何も通知せずに2回呼び出してもエラーが表示されないのはなぜですか? 私はちょうどプロデューサーを実行したので、他のスレッドはそれを知らせるためにそこにいないので、wait()
メソッドは無限と呼ばれます。 最初のwait()
コールの後で所有権が失われても、後続の待機コールでexceptions.isn'tがスローされるはずですが、なぜうまくいきますか?
class Producer extends Thread {
private Queue<Integer> queue;
private int maxSize;
public Producer(Queue<Integer> queue, int maxSize, String name) {
super(name);
this.queue = queue;
this.maxSize = maxSize;
}
public void run() {
while (true) {
synchronized (queue) {
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
「複数回」とは何を意味しますか?上の 'run()'メソッドを別のスレッドから呼び出すのですか? (あなたが私たちに示していないコードから呼び出されているかもしれません) – markspace