2012-12-21 3 views
0
을 중지하지
public static void main(String[] args) throws Exception { 
    final Exchanger<String> exchanger = new Exchanger<String>(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       System.out.println(Thread.currentThread().getName() + exchanger.exchange("this came from subthread")); 
      } catch (InterruptedException ex) { 
       System.out.println("interrupted while waiting for message"); 
      } 
     } 
    }).start(); 

    System.out.println(Thread.currentThread().getName() + exchanger.exchange("this came from main thread")); 
    String s = exchanger.exchange("this came from main thread"); 
} 

출력기 : JVM은 결코

mainthis came from subthread 
Thread-0this came from main thread 

왜 JVM 여기 종료하지 않습니다?

답변

2

스레드에는 교환 지점이 하나 있지만 주 스레드에는 교환 지점이 2 개 있습니다. 그래서 두 번째 교환 : String s = exchanger.exchange("this came from main thread");은 영원히 기다리고 JVM이 종료하지 못하게합니다. 해당 행 다음에 print 문을 추가하면 실행되지 않습니다. 당신이 당신의 스레드에서 두 번째 교환을 추가하는 경우

, 프로그램이 종료됩니다 :

public void run() { 
    try { 
     System.out.println(Thread.currentThread().getName() + exchanger.exchange("this came from subthread")); 
     exchanger.exchange("allow JVM to exit here"); 
    } catch (InterruptedException ex) { 
     System.out.println("interrupted while waiting for message"); 
    } 
} 
+0

주 방법의 마지막 줄이 제거되면 어떻게됩니까? – Subin

+0

@SubinS 그게 너무 작동합니다. – assylias

+0

물론 이것은 바보 같은 질문입니다. 한 번 붙여 넣기로 인해이 오류가 발생했습니다 ... 내 코드 보스 팅을 여기에서 보았어야합니다 .. 일식에, 어떻게 든 그 두 줄을 나란히 붙여 붙여 놓았습니다. 그것을 놓쳤습니다 .. : ( – Achow

0

마지막 줄 :

String s = exchanger.exchange("this came from main thread"); 

가 다른 스레드와 교환 "this came from main thread"을 제공하지만 다른이 없습니다 카운터 제안을 만들기위한 스레드.