我有一個主函數可以創建一些複雜的東西的子線程。我注意到,在某些情況下,我的主函數返回,但java進程仍然存在。 (我知道主函數返回,因爲在我的主要功能的最後一行我打印日誌)(我知道java進程仍然存在,因爲'ps aux | grep stuff'告訴我這樣)。java進程仍然生活在主函數返回後
我想知道這是預期的行爲?如何確保java進程在主函數返回後死亡?
謝謝! Erben
我有一個主函數可以創建一些複雜的東西的子線程。我注意到,在某些情況下,我的主函數返回,但java進程仍然存在。 (我知道主函數返回,因爲在我的主要功能的最後一行我打印日誌)(我知道java進程仍然存在,因爲'ps aux | grep stuff'告訴我這樣)。java進程仍然生活在主函數返回後
我想知道這是預期的行爲?如何確保java進程在主函數返回後死亡?
謝謝! Erben
如果您需要結束的過程(以及所有子代碼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
可能是一個noob問題,System.exit(0)和返回之間有區別嗎? – 2014-10-22 03:26:06
我明白了。即使是主返回,子線程仍可能被執行。 – 2014-10-22 03:27:27
@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
main
本身就是一個線程。在main
退出後,其他線程仍在運行。
main
返回使用System.exit(0)
main
線程等待,直到所有線程都完成使用Thread.join()
你能否澄清這些「特定場景」是什麼? – yiwei 2014-10-22 03:13:21
可能是你的孩子線程還在運行? 請詳細說明/顯示更多代碼 – 2014-10-22 03:15:43
我在java中沒有常識,因爲它對我來說是一種相對較新的語言。有常識的人可以證實,如果主線程死了,jvm將永遠殺死子線程,整個jvm進程將退出? – 2014-10-22 03:23:32