在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