2014-10-07 64 views
0

Java 1.5+是否System.exit(0)作爲最後一條語句有所作爲?

class A和class B有什麼不同?

public class A { 
    public static void main(String args[]) { 
     System.out.println("Ending.."); 
     System.exit(0); 
    } 
} 

public class B { 
    public static void main(String args[]) { 
     System.out.println("Ending.."); 
    } 
} 

如果System.exit(0)System.exit(1)是要執行的程序的最後一條語句,將A類和B類的行爲在程序執行的各個方面一樣嗎?

我知道按照慣例,非零狀態碼錶示異常終止。

回答

1

Class A「明確」關閉。這意味着如果有任何線程仍在運行,它們將被明確停止(被告知,而不是消亡)。

Class B「隱式地」關閉,看到主線程是在這種情況下唯一運行的非守護進程線程,並且在打印語句之後,它將結束。

檢查出Thread#setDaemon(boolean)的文檔:Java虛擬機退出時正在運行的線程都是守護線程。」

最後,應用程序被關閉了,所以我想它並沒有真正改變,除了第一個被告知關閉,第二個被「關閉」。最好讓線程消失,而不是被告知。這是一個額外的步驟;您也不需要費心執行exit(int)方法中的任何額外語句。該方法的代碼可以在這裏找到:GrepCode: Shutdown#exit(int)

0
  • 如果您沒有明確指定退出代碼爲System.exit(),則默認退出代碼爲0
  • 我不太確定,但它可能影響File.deleteOnExit()調用。
  • Systeme.exit()立即終止您的程序,即使其他非守護程序線程仍在運行。在ClassB的情況下,這些線程和程序將繼續運行,直到退出所有非後臺進程線程。
+0

我沒有想到File.deleteOnExit()。好點子。 – 2014-10-07 21:20:48