2010-12-11 2 views

답변

0

귀하의 답변은 귀하가 직접 언급 한 Javadoc에 있습니다. 분명히 메서드는 두 번째 스레드가 메서드를 호출 할 때까지 첫 번째 스레드를 차단합니다.

2

교환기가 스레드를 차단하지 않으면 교환기에 도달하는 첫 번째 스레드가 대기하게됩니다.

1

전화 교환을 변경 첫 번째 스레드가 WAITING

간단한 코드에 상태가 어떻게되는지입니다 :

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

명확하게하기 위해, 여섯 개 스레드 상태가 있습니다 : NEW RUNNABLE, BLOCKED는, 대기 중, 대기 중 및 대기 중입니다.

시나리오에서 첫 번째 스레드는 RUNNABLE에서 WAITING으로 이동하고 두 번째 스레드가 도착할 때까지 대기합니다.

BLOCKED 상태는 뮤텍스 획득을 기다리는 동안 스레드가 차단 된 경우 사용됩니다. 이 특별한 경우, 첫 번째 쓰레드는 뮤텍스를 먼저 얻는 것이므로, 그 시점에서 BLOCKED 상태가되지 않습니다. 그러나 두 번째 스레드가 도착하면 잠시 BLOCKED 상태가되거나, 알림을 수신 한 후 후에 첫 번째 스레드가 일시적으로 BLOCKED 상태 이 될 수 있습니다.

관련 문제