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

时间:2012-01-11 17:02:55

标签: java multithreading daemon

似乎守护程序线程总是更好 - 因为在应用程序主线程退出后它们将被VM停止。除了无法中断某些操作的情况之外,还有其他原因可以使用非守护程序线程吗? 感谢。

5 个答案:

答案 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可能会在执行过程中停止守护程序线程,因此持久性数据可能会被破坏。

如果您需要更多控制线程何时死亡,请不要将其作为守护进程。