在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. Java中的System.exit線程
- 3. 應該在主線程之外的線程中調用URLForUbiquityContainerIdentifier:
- 4. 我應該使用哪個線程或進程?
- 5. Java應用程序在調用System.exit時不退出(0)
- 6. 在調用System.exit(0)後應用程序繼續運行 - Java
- 7. C++線程 - 如果調用類函數,哪個線程將執行該工作
- 8. 應該調用哪個TextFieldDelegate方法?
- 9. Android應用程序應該在哪裏調用SQLite getWritableDatabase?
- 10. 在哪個線程中調用了終止處理程序?
- 11. 在哪個線程中調用iOS完成處理程序塊?
- 12. PHP - 我應該在哪裏調用ini_set?
- 13. 我應該在哪裏調用TDSSessionManager.Instance.AddSessionEvent?
- 14. System.exit(1)在多線程程序中存在,返回碼爲0
- 15. 我應該在UI線程中調用`Service`的函數嗎?
- 16. java.lang.IllegalStateException:方法調用不應該從piccaso的主線程發生
- 17. 在Java中的線程內調用線程時應該考慮什麼?它應該被避免嗎?
- 18. 在Perl中執行多線程應該注意哪些模塊?
- 19. 我是否必須在Webstart應用程序中顯式調用System.exit()?
- 20. 我應該在Linux上使用哪個線程庫用於多線程C程序?
- 21. ON應該調用該函數的哪個事件?
- 22. 我應該處理哪個線程RxTx SerialEvent.DATA_AVAILABLE事件?
- 23. WCF/WebSerices應該放在Silverlight應用程序的哪個位置?
- 24. 我應該在DroneDeploy應用程序中使用哪些樣式?
- 25. 在iPhone應用程序中的線程後調度線程
- 26. 我應該在哪裏提交事務 - 在存儲過程中還是在調用應用程序代碼中?
- 27. 單線程應用QT時隙執行哪個線程
- 28. 我應該從哪裏開始使用Facebook應用程序?
- 29. 應該在主線程上調用becomeFirstResponder()嗎?
- 30. 在Silverlight中從BeginGetResponse調用UI線程
不應該是'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