0

簡単な質問お願いします。Java のオブジェクトで通知を呼び出した場合、通知を呼び出した後に (厳密に) 待機しているスレッドを起動しないことが保証されますか? つまり、すでに待機していたウェイクアップ スレッドのみを通知します。おそらく、notifyAll同じように動作します。

たとえば、保証が成り立たない場合、次の順序で可能です。

  1. スレッド N はロックを取得し、通知を呼び出し、ロックを解放します。
  2. スレッド W はロックを取得し、wait を呼び出してロックを解放します。
  3. スレッド W はスレッド N の通知によって起動され、続行します...

ご協力いただきありがとうございます!

4

2 に答える 2

0

notify を呼び出すと、待機中のスレッド (存在する場合) の 1 つが起動されます。このオブジェクトを現在待機していないスレッドを起こすことはできません。また、まだ待機していない (後で待機する予定の) スレッドを起こすこともできません (明らかに)。

notifyAll を呼び出すと、現在待機中のすべてのスレッドが起動されます。

ここでヒットについて読むことをお勧めします

于 2013-04-07T16:38:25.667 に答える
0

まあ、notify()メソッドのjavadocはそれを明確に述べています:

このオブジェクトのモニターで待機している単一のスレッドを起動します。

についても同じですnotifyAll()

このオブジェクトのモニターで待機しているすべてのスレッドを起こします。

待機中のスレッドのキューに入れるには、スレッドはまずオブジェクトのロックを取得してから解放する必要があります。その後で、他のスレッドがロックを取得して を呼び出すことができますnotify()

なので気にしなくていいと思います。

于 2013-04-07T16:38:26.693 に答える