[英]Why need use non-daemon threads in java?
似乎守护程序线程总是更好 - 因为它们将在应用程序主线程退出后由VM停止。 除了无法中断某些操作的情况之外,还有其他原因可以使用非守护程序线程吗? 谢谢。
在编写服务器(例如servlet容器)时,所有main
工作都是引导和启动HTTP侦听器线程,接受线程,文件系统扫描线程,RMI线程等。
完成引导程序后,不再需要main
,因为所有内容都是异步发生的。 在这种情况下,所有必需线程都是非守护进程,因为它们必须经过main
方法。
即使在Swing(桌面编程)中, main
的唯一要求是初始化主窗口( JFrame
)。 其余的发生在Swing监听器线程(EDT)和各种后台线程中。
实际上,任何应该自然完成的线程(保留其“run”方法) 都不应该是守护程序线程,因为您不希望JVM在它们完成工作时终止。
这适用于您启动的每个线程,并且您希望自然终止。
根据经验,守护程序线程是例外,而不是规则。
一个主要的区别在于守护程序线程如何退出; JVM只是阻止它们。
finally
块不会被执行 您不希望将守护程序线程用于需要保留在已知状态的事物,例如文件i / o,数据库事务等。
每当你做一些你不想停止因为另一个线程退出的东西时,你就会使用非守护程序线程。 如果线程的唯一目的是支持其他线程,那么使用守护程序线程是有意义的。
如果要在主线程退出时退出,可以调用System.exit()。 许多应用程序不保留其主线程,所有工作都在它启动的线程中。
VM可能会在执行过程中停止守护程序线程,因此持久性数据可能会被破坏。
如果您需要更多控制线程何时可以安全死亡,请不要将其作为守护进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.