守护程序线程何时有用?

时间:2011-08-15 16:17:49

标签: java

我知道Deamon会破解后台线程。我们可以通过调用setDaemon(true)来创建我们自己的守护程序线程。

我的问题是:为什么以及何时需要将我们的线程创建为守护线程?

7 个答案:

答案 0 :(得分:51)

当所有正在运行的线程都是守护程序线程时,JVM退出。所以想象一下,你正在写一个简单的游戏,你的主要方法循环,​​直到你决定退出。并且想象一下,在游戏开始时,您启动一​​个线程,无休止地轮询某个网站以触发警报。当您决定结束游戏时,您希望JVM退出。你不希望无休止的轮询阻止游戏结束。因此,您将此轮询线程设置为守护程序线程。

答案 1 :(得分:11)

当所有“正常”线程终止时,JVM会自动终止守护程序线程。正常线程永远不会自动终止。

答案 2 :(得分:5)

您希望通过基本用户线程向您的消费者提供的服务没有任何用户交互,这构成了将用户线程设置为守护进程的主要用例。

因此,在用户线程存在之前,JVM保证守护程序线程不断运行。您可以找到GC,UI Thread等示例。这些是守护进程。

希望它有所帮助。

答案 3 :(得分:2)

正如其他人所指出的,守护程序线程不会阻止JVM在该线程仍在运行时程序完成时退出。

一般情况下,您宁愿不创建守护程序线程,除非您绝对确定该线程没有副作用。由于您无法判断线程何时停止,因此不会运行终结器块,也不会释放任何堆栈。因此,请避免在守护程序线程中使用IO操作,因为它可能会破坏数据。

答案 4 :(得分:1)

通常程序在其所有线程退出其run()方法时终止。守护程序线程不会阻止程序终止,即使它们仍在运行,即执行run()

因此,如果您希望在线程仍在运行时不阻止程序终止,则应使用守护程序线程。例如,对于长时间的定期任务来说,这通常很大程度上取决于你的程序,设计和品味。

答案 5 :(得分:0)

我将它们与Timer一起用来删除无法立即删除的文件。也就是说,我生成.exe文件,运行然后删除它们。但executable.delete失败的几率为50%,似乎是因为终止过程中图像仍被阻止。只有在完成进程后才能可靠地删除可执行映像。但是,你永远不知道需要多长时间。因此,设置.deleteOnExit而不是.delete。但是,你不想等到java机器也终止。它可能需要很长时间,你不需要数百万无用的愚蠢的.exe文件,你不再需要它们,挂在文件系统中。因此,您可以在计时器中安排executable.delete,以便在1-2秒后发生。然而,计时器不能是通常的线程。如果是这样,即使没有要删除的文件,它也会阻止程序终止。我可以很容易地使它成为守护进程,因为我的文件是否被计时器删除是无关紧要的 - 文件将被删除:通过守护进程或java退出。我认为这是守护进程的完美使用。

答案 6 :(得分:0)

Java中的守护程序线程就像是与守护程序线程在同一进程中运行的其他线程或对象的服务提供程序。守护程序线程用于后台支持任务,仅在正常线程执行时才需要。如果正常线程没有运行而剩余线程是守护线程,则解释器退出。

创建新线程时,它会继承其父级的守护程序状态。正常的线程和守护程序线程在退出时会发生什么不同。当JVM停止时,任何剩余的守护程序线程都被放弃:最后块不会被执行,堆栈也不会被解除 - JVM就会退出。由于这个原因,应该谨慎使用守护程序线程,并且将它们用于可能执行任何类型I / O的任务是危险的。