1

生産上の問題を診断しようとしています。Mac OS Lionで、10個のスレッドを起動する小さなテストプログラムをセットアップしました(同期ブロックですべてMUTEX.wait()を呼び出すExecutors.newCachedThreadPool()を使用)

次に、kill -3を実行してスレッドダンプを取得すると、すべてのスレッドがBLOCKEDと表示されます。これらはすべて待っているべきではありませんか?

コードは次のようなものです(簡潔にするために導入されたコードの臭いはご容赦ください)

ExecutorService executor = Executors.newCachedThreadPool();
final Object MUTEX = new Object();
for(int i = 0; i < 10; i++) {
   executor.execute(new Runnable() {
      public void run() {
        synchronized(MUTEX) {
         MUTEX.wait();
}  }   }}

この時点で、すべてのスレッドはWAITING状態になっているはずですが、実際には、スレッドダンプはすべてがブロックされていることを示しています。

4

1 に答える 1

4

スレッドはモニターロックが同期されたブロック/メソッドに入るのを待っているため、スレッドのステータスはBLOCKEDです。

モニターロックを待機してブロックされているスレッドはBLOCKED状態にあり、別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドはWAITING状態にあります。

BLOCKEDとの違いの詳細については、以下を参照してくださいWAITING

BLOCKEDのJavaDocから:

モニターロックの待機中にブロックされたスレッドのスレッド状態。ブロック状態のスレッドは、モニターロックが同期ブロック/メソッドに入るのを待っているか、呼び出し後に同期ブロック/メソッドに再び入るのを待っていますObject.wait

WAITINGのJavaDocから:

待機状態のスレッドは、別のスレッドが特定のアクションを実行するのを待機しています。たとえば 、オブジェクトを呼び出したスレッドは、別のスレッドが呼び出すか、そのオブジェクトObject.wait()を待機し ています。呼び出したスレッドは、指定されたスレッドが終了するのを待っています。Object.notify()Object.notifyAll()Thread.join()

于 2012-12-13T15:50:55.307 に答える