在Swing應用程序中,是否可以從任何線程調用System.exit()
? (例如在EDT上)從哪個線程應該在Swing-app中調用System.exit()?
回答
如果您能幫到您,請不要致電System.exit()
。
退出java進程的最好方法是讓所有線程正常退出。這將終止VM。
在你的主JFrame
,你應該setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
。
然後您可以致電frame.dispose()
關閉JFrame
並退出EDT。
由於虛擬機在System.exit()
調用後終止,所以我認爲它並不影響正在調用哪個線程。
我同意。由於exit()殺死了路徑中的所有內容,所以你不應該關心哪個線程調用它。 – f1sh 2010-07-19 14:17:44
System.exit()
不終止正在運行的線程,而是終止虛擬機本身。因此可以從任何線程調用它,結果總是相同的,如果VM死亡,線程中所有可能的不可感知狀態將不會立即存在。
你可以從任何線程調用它,但它使用它恕我直言是一種粗魯。不管別的什麼東西在運行,虛擬機都會被終止。
我更喜歡dispose()
或只是關閉(有setDefaultCloseOperation(DISPOSE_ON_CLOSE)
)任何顯示的窗口(JFrame,JDialog,...)。如果只有守護程序線程正在運行,則虛擬機將被終止。如果有一些活的非守護線程,JVM將不會終止,並且線程可以完成其工作。
這樣做,我總是可以將一個程序的(部分)包含在另一個程序中,而不必擔心其中一個程序是否會意外終止另一個程序。
有極少數的情況下的JVM真的需要被「封殺」 ......
有秋千規則的EDT線程正常終止。
最重要的是要確保所有的框架已被處置。 不幸的是,如果您在沒有父母的情況下使用模態對話框,這可能不那麼簡單,因爲Swing會爲這些對話框創建一個不可見的父框架。
在這種情況下,您必須列出所有框架(您可以使用Frame.getFrames()
),並明確地指定dispose()
。
當然,你必須確保沒有Thread
活着(守護進程除外)。有些庫甚至JDK的一些API會創建非守護線程,您必須關閉自己。
最後,最重要的是,不調用System.exit()將無法在Java Web Start環境中工作(請參閱this SO question以查找更多信息)。
所以,最後,我的建議是實際調用System.exit()
,因爲您並不總是知道應用程序將在哪個環境中啓動。但我會添加一個重要的點:確保有一個從哪個退出執行的點。從調用它,任何線程都會好的。
從你想要的任何線程中調用System.exit絕對沒有錯。讓它「正常」退出實際上並不奏效,因爲當應用程序退出之前,您會發現應用程序將在GC收集內容時處於閒置狀態。 我寫了大量的gui Swing應用程序,調用它絕對沒有錯。這也不是「粗魯」。這是Java的方式。
- 1. 哪個線程正在調用該行?
- 2. .Net:CallBack應該在哪個線程上?
- 3. 我應該從哪個類調用locationManger.removeUpdates()?
- 4. 該回調的哪個線程運行?
- 5. Java中的System.exit線程
- 6. 應該在主線程之外的線程中調用URLForUbiquityContainerIdentifier:
- 7. system.exit()在Java中去哪裏?
- 8. 如何防止Web應用程序在WSO2中調用System.exit()?
- 9. 我應該從哪裏調用CakeResponse :: disableCache()?
- 10. 我應該使用哪個線程或進程?
- 11. UiKit應該從主線程中調用只警告
- 12. Java應用程序在調用System.exit時不退出(0)
- 13. 在調用System.exit(0)後應用程序繼續運行 - Java
- 14. Android應用程序在調用System.exit後表現異常(0)
- 15. 應該調用哪個TextFieldDelegate方法?
- 16. C++線程 - 如果調用類函數,哪個線程將執行該工作
- 17. 我應該在Java Hibernate應用程序中使用哪個PERSIST?
- 18. Android應用程序應該在哪裏調用SQLite getWritableDatabase?
- 19. 從Java調用Oracle過程 - 調用System.exit()時會發生什麼?
- 20. 我應該在EDT中創建的線程中調用InvokeLater嗎?
- 21. 在哪個線程中調用iOS完成處理程序塊?
- 22. 在哪個線程中調用了終止處理程序?
- 23. PHP - 我應該在哪裏調用ini_set?
- 24. 你應該在哪裏調用PreferenceManager.setDefaultValues?
- 25. 我應該在哪裏調用TDSSessionManager.Instance.AddSessionEvent?
- 26. 在第一個線程退出後哪個線程被調度?
- 27. 我應該在哪個時間和哪個上下文中調用ThreadPool.SetMinThreads
- 28. 我應該在UI線程中調用`Service`的函數嗎?
- 29. 應該在UI線程中調用findviewbyid嗎?
- 30. System.exit(1)在多線程程序中存在,返回碼爲0
不應該是'DISPOSE_ON_EXIT'?使用'EXIT_ON_CLOSE'還會導致正在運行的線程被終止,而不允許它們正常退出(當用戶關閉JFrame時)。 – 2010-07-19 19:15:44
我不同意。 GC需要一段時間才能完成,應用程序退出。一旦你處理完你應該做的事情,調用System.exit沒有任何問題。在調用System.exit之後,文件,套接字以及這些關閉只能自己找到。 – Mike 2010-07-20 03:02:14