8

オブジェクトのwait()メソッドを呼び出すと、オブジェクト モニターがあれば解放されることを学びました。

notify()しかし、別のスレッドによるこのオブジェクトの呼び出しに関していくつか質問があります。

  1. その間、別の(3番目の)スレッドがオブジェクトモニターを所有している場合、待機中のスレッドは(いつ)ウェイクアップしますか?

  2. wait()このオブジェクトで3 番目のスレッドが呼び出された場合、待機中のスレッドは起動しますか?

  3. スレッドが特定のオブジェクトへの通知を待機しているかどうかを判断することは可能ですか (Java 1.4/Java 5)

  4. メソッドwait()で が呼び出されるとどうなりますか?finalize()

4

4 に答える 4

3

スレッドから wait() を呼び出すと、そのスレッドは実行を停止し、オブジェクトのウェイトセットに追加されます。別のスレッドから notify() を呼び出すと、waitset のランダム スレッドが起動されます。notifyAll() を呼び出すと、すべての実行準備が整います。

notify() を呼び出すと、スレッドは実行可能になりますが、すぐに実行されるわけではないので注意してください。

  1. ウェイトセットからランダムにスレッドを起こします。

  2. どちらが最初に起動されるかはわかりません。順序には従いません。

  3. Thread.getState()

  4. デッドロックが発生します。

于 2010-07-06T22:14:05.343 に答える
2
  1. notify()notifyAll()メソッドがあるのはそのためです。前者はオブジェクトを待機している 1 つのスレッドを起動し、後者はすべてのスレッドを起動します。wait()別のスレッドで呼び出された場合、待機中のスレッドは起動しません。

  2. いいえ。

  3. thread.holdsLock(obj)スレッドが特定のオブジェクトのモニター ロックを保持しているかどうかを確認するために呼び出すことのみが可能です。

  4. wait()finalize メソッドを呼び出さないでください。

于 2010-07-06T22:10:03.367 に答える
2
  1. notifyモニターで待機している 1 つのスレッドを起こします。モニターが所有されていない限り、所有されていないスレッドは実行できません。wait() は同期ブロックで呼び出す必要があるため、そのブロックの実行を継続するにはロックを保持する必要があります。
  2. 保証はありません。すべてのスレッドにウェイクアップの機会notifyAllを与えるために呼び出します。
  3. わからない。スレッドがスリープ状態になる前に待機していることを示す変数を設定することができます...
  4. これはおそらく悪い考えです。これが必要な状況を思いつくことができますか?
于 2010-07-06T22:11:50.560 に答える
0

2:必ずしもそうではありません。待機中のスレッドの1 つnotify()を起こします。初代か三代目かもしれません。

3: を使用thread.getState()すると、スレッドがオブジェクトを待機しているかどうかを確認できますが、これがどのオブジェクトであるかを常に正確に確認できるかどうかはわかりません。

于 2010-07-06T22:10:44.617 に答える