繁体   English   中英

为什么需要在java中使用非守护进程线程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM