似乎守护程序线程总是更好 - 因为在应用程序主线程退出后它们将被VM停止。除了无法中断某些操作的情况之外,还有其他原因可以使用非守护程序线程吗? 感谢。
答案 0 :(得分:6)
当您编写服务器(例如servlet容器)时,main
所需要做的就是引导和启动HTTP侦听器线程,接受线程,文件系统扫描线程,RMI线程等。
完成引导程序后,不再需要main
,因为所有内容都是异步发生的。在这种情况下,所有基本线程都是非守护进程,因为它们必须超过main
方法。
即使在Swing(桌面编程)中,main
的唯一要求是初始化主窗口(JFrame
)。其余的发生在Swing监听器线程(EDT)和各种后台线程中。
答案 1 :(得分:4)
事实上,任何应该自然完成的线程(保留其“run”方法)不应该是守护程序线程,因为您不希望JVM在执行其工作时终止。
这适用于您启动的每个主题,并且您希望自然终止。
根据经验,守护程序线程是例外,而不是规则。
答案 2 :(得分:4)
一个主要区别在于守护程序线程如何退出; JVM只是阻止它们。
finally
块未执行您不希望将守护程序线程用于需要保留在已知状态的事物,例如文件i / o,数据库事务等。
答案 3 :(得分:2)
每当你做一些你不想停止因为另一个线程退出的东西时,你就会使用非守护程序线程。如果线程的唯一目的是支持其他线程,那么使用守护程序线程是有意义的。
如果要在主线程退出时退出,可以调用System.exit()。许多应用程序不保留其主线程,所有工作都在它启动的线程中。
答案 4 :(得分:1)
VM可能会在执行过程中停止守护程序线程,因此持久性数据可能会被破坏。
如果您需要更多控制线程何时死亡,请不要将其作为守护进程。