4

スレッド Aにオブジェクトがあり、スレッド Bwait()の別のオブジェクトが何らかの作業を行ってから、スレッド Aのオブジェクトの. その後、スレッド A はいくつかの後処理を実行します。notify()

私の問題はかなり簡単です:

synchronized(this)
{
    while(!flag)
    {
        try
        {
            wait();
            getLogger().info("No longer waiting");
        }
        catch (InterruptedException ie)
        {
            getLogger().info("Wait threw InterruptedException");
        }
    }
}

「Wait throwed InterruptedException」ではなく、「もう待機していません」という情報メッセージが表示されます。

このため、私は混乱しています(http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()):

スロー:

InterruptedException - 現在のスレッドが通知を待機する前または待機中に、別のスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの中断ステータスがクリアされます。

奇妙な振る舞いをするのはなぜですか?

ありがとう。

4

4 に答える 4

10

スレッドが を使用して待機する場合、wait()実際には を待機しnotify()ます。したがってnotify()、 が他のスレッドによって呼び出されると、このスレッドは続行されます。 を呼び出すとinterrupt()、例外が発生します。

また、リンク先のドキュメントから:

別のスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すまで、現在のスレッドを待機させます。

notifyスレッドをロックから解放します。

InterruptedException - 現在のスレッドが通知を待機する前または待機中に、別のスレッドが現在のスレッドに割り込んだ場合。

 

于 2011-05-19T06:18:13.163 に答える
3

notify()wait()投げませんInterruptedException。通常のプログラム フローを続行しますnotify()wait()

于 2011-05-19T06:17:31.067 に答える
2

notify()wait()-ing中のスレッドの異常終了ではありません。notify()たとえば、呼び出された結果としてではなく、呼び出される前にスレッドが終了した場合、例外が発生しますnotify()。スレッドは中断されていません。起動されています。

于 2011-05-19T06:16:43.420 に答える
0

そのコードにバグがあることに注意してください。Wait は常にループ内で呼び出され、ウェイクアップ後に状態を確認する必要があります。

wait は偽の wakeup によって起こされる可能性があります。javadocのwait()を参照してください

于 2011-05-19T06:19:08.250 に答える