2010-07-19 60 views

回答

6

如果您能幫到您,請不要致電System.exit()

退出java進程的最好方法是讓所有線程正常退出。這將終止VM。

在你的主JFrame,你應該setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

然後您可以致電frame.dispose()關閉JFrame並退出EDT。

+3

不應該是'DISPOSE_ON_EXIT'?使用'EXIT_ON_CLOSE'還會導致正在運行的線程被終止,而不允許它們正常退出(當用戶關閉JFrame時)。 – 2010-07-19 19:15:44

+2

我不同意。 GC需要一段時間才能完成,應用程序退出。一旦你處理完你應該做的事情,調用System.exit沒有任何問題。在調用System.exit之後,文件,套接字以及這些關閉只能自己找到。 – Mike 2010-07-20 03:02:14

5

由於虛擬機在System.exit()調用後終止,所以我認爲它並不影響正在調用哪個線程。

+0

我同意。由於exit()殺死了路徑中的所有內容,所以你不應該關心哪個線程調用它。 – f1sh 2010-07-19 14:17:44

1

System.exit()不終止正在運行的線程,而是終止虛擬機本身。因此可以從任何線程調用它,結果總是相同的,如果VM死亡,線程中所有可能的不可感知狀態將不會立即存在。

3

你可以從任何線程調用它,但它使用它恕我直言是一種粗魯。不管別的什麼東西在運行,虛擬機都會被終止。

我更喜歡dispose()或只是關閉(有setDefaultCloseOperation(DISPOSE_ON_CLOSE))任何顯示的窗口(JFrame,JDialog,...)。如果只有守護程序線程正在運行,則虛擬機將被終止。如果有一些活的非守護線程,JVM將不會終止,並且線程可以完成其工作。
這樣做,我總是可以將一個程序的(部分)包含在另一個程序中,而不必擔心其中一個程序是否會意外終止另一個程序。

有極少數的情況下的JVM真的需要被「封殺」 ......

0

有秋千規則的EDT線程正常終止。

最重要的是要確保所有的框架已被處置。 不幸的是,如果您在沒有父母的情況下使用模態對話框,這可能不那麼簡單,因爲Swing會爲這些對話框創建一個不可見的父框架。

在這種情況下,您必須列出所有框架(您可以使用Frame.getFrames()),並明確地指定dispose()

當然,你必須確保沒有Thread活着(守護進程除外)。有些庫甚至JDK的一些API會創建非守護線程,您必須關閉自己。

最後,最重要的是,不調用System.exit()將無法在Java Web Start環境中工作(請參閱this SO question以查找更多信息)。

所以,最後,我的建議是實際調用System.exit(),因爲您並不總是知道應用程序將在哪個環境中啓動。但我會添加一個重要的點:確保有一個從哪個退出執行的點。從調用它,任何線程都會好的。

1

從你想要的任何線程中調用System.exit絕對沒有錯。讓它「正常」退出實際上並不奏效,因爲當應用程序退出之前,您會發現應用程序將在GC收集內容時處於閒置狀態。 我寫了大量的gui Swing應用程序,調用它絕對沒有錯。這也不是「粗魯」。這是Java的方式。

相關問題