2012-12-21 100 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

在您的主題中有一個交換點,但在主線程中有兩個交換點。所以第二個交換:String s = exchanger.exchange("this came from main thread");永遠等待並阻止JVM退出。如果在該行之後添加打印語句,您將看到它不會被執行。

如果添加在你的線程第二交換,該程序將退出:

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"與一些其他線程交換,但沒有其他線索來提出還價。