2010-12-11 6 views

答えて

0

あなたの回答はあなた自身で述べたJavadocにあります。どうやら、メソッドは、2番目のスレッドがメソッドを呼び出すまで、最初のスレッドをブロックします。

2

エクスチェンジャーはスレッドをブロックせず、エクスチェンジャーに到達する最初のスレッドを待ちます。

1

交換を呼び出す最初のスレッドがWAITING

に何が起こるかを参照するには、簡単なコードスニペット状態です変更:NEW、RUNNABLE、BLOCKED、:

public class ExchangerTest { 

    public static void main(String[] args) throws InterruptedException { 
     final Exchanger<Long> ex = new Exchanger<Long>(); 

     Thread t1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println("thread 1"); 
       try { 
        ex.exchange(10L); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } 
      } 
     }); 
     t1.start(); 
     Thread.sleep(500); //give t1 time to start 
     System.out.println(t1.getState()); 
    } 
} 
2

を明確にするため、6つのスレッドの状態があります待機中、待機中および終了中。

シナリオでは、最初のスレッドはRUNNABLEからWAITINGに移行し、2番目のスレッドが到着するまでWAITINGに留まります。

BLOCKED状態は、mutexの獲得を待っている間にスレッドがブロックされている場合に使用されます。この特定のケースでは、最初のスレッドはミューテックスを最初に取得するスレッドであるため、その時点でBLOCKED状態にはなりません。ただし、到着時に2番目のスレッドが一時的にBLOCKED状態になる可能性があります。または、が通知を受信した後で最初のスレッドが一時的にBLOCKED状態になることがあります。

関連する問題