2014-10-22 58 views
0

我有一個主函數可以創建一些複雜的東西的子線程。我注意到,在某些情況下,我的主函數返回,但java進程仍然存在。 (我知道主函數返回,因爲在我的主要功能的最後一行我打印日誌)(我知道java進程仍然存在,因爲'ps aux | grep stuff'告訴我這樣)。java進程仍然生活在主函數返回後

我想知道這是預期的行爲?如何確保java進程在主函數返回後死亡?

謝謝! Erben

+0

你能否澄清這些「特定場景」是什麼? – yiwei 2014-10-22 03:13:21

+3

可能是你的孩子線程還在運行? 請詳細說明/顯示更多代碼 – 2014-10-22 03:15:43

+0

我在java中沒有常識,因爲它對我來說是一種相對較新的語言。有常識的人可以證實,如果主線程死了,jvm將永遠殺死子線程,整個jvm進程將退出? – 2014-10-22 03:23:32

回答

1

如果您需要結束的過程(以及所有子代碼Thread(s))請使用System.exit(0)

實施例1

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Later: " + System.currentTimeMillis()); 
     } 
    }); 
    try { 
     System.out.println("now: " + System.currentTimeMillis()); 
     // System.exit(0); 
    } finally { 
     System.out.println("finally: " + System.currentTimeMillis()); 
    } 
} 

輸出是

now: 1413948102997 
finally: 1413948102997 
Later: 1413948103999 

實施例2

但是,從System.exit(0);刪除註釋和輸出是一樣的東西(無最後後來

now: 1413948221629 
+0

可能是一個noob問題,System.exit(0)和返回之間有區別嗎? – 2014-10-22 03:26:06

+1

我明白了。即使是主返回,子線程仍可能被執行。 – 2014-10-22 03:27:27

+0

@ErbenMo是的。 ['System.exit(int)'](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit%28int%29)終止JVM。 – 2014-10-22 03:27:56

0

main本身就是一個線程。在main退出後,其他線程仍在運行。

  • 主要出路,所有的退出: - 爲了確保您結束所有子線程main返回使用System.exit(0)
  • 之前所有出口,主要出口: - 如果你想main線程等待,直到所有線程都完成使用Thread.join()
相關問題