2011-08-15 78 views
36

我知道Deamon线程后台线程。我们可以通过调用setDaemon(true)来创建我们自己的守护进程线程。守护线程什么时候有用?

我的问题是:为什么和什么时候我们需要创建我们的线程作为守护线程?

回答

43

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

+0

在你的例子中,当用户决定结束游戏时,如果有用户线程(而不是守护进程线程)仍在运行,那么JVM块是否会继续运行? – Kal

+0

@Kal:是的,这是它的工作方式。用户线程会阻止JVM关闭。 –

+1

是的:如果主要方法简单地返回,JVM将继续运行。当然,如果您调用System.exit,它将停止运行。 –

10

当所有“正常”线程终止时,Deamon线程将被JVM自动终止。普通线程永远不会自动终止。

4

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

因此,直到用户线程存在JVM保证守护进程线程连续运行。你可以找到像GC,UI线程等例子。这些都是守护进程。

希望它有帮助。

1

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

因此,如果您希望在线程仍在运行时不阻止程序终止,则应该使用守护进程线程。例如对于长期的周期性任务来说,这是典型的,但实际上非常依赖于您的计划,设计和品味。

2

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

一般来说,你不应该创建守护线程,除非你完全确定线程没有副作用。由于您无法确定线程什么时候停止,所以终结块将不会运行,也不会解开任何栈。因此,请尽量避免在守护进程线程中使用IO操作,因为它会破坏数据。

0

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

0

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

当一个新的线程被创建时,它会继承它父进程的守护进程状态。普通线程和守护进程线程在退出时会发生什么变化。当JVM停止任何剩余的守护进程线程时,抛弃:finally块不会被执行,堆栈不会被解除 - JVM刚刚退出。由于这个原因,应该谨慎地使用守护进程线程,并且将它们用于可能执行任何类型的I/O的任务是危险的。

+0

尝试避免在守护进程线程中使用IO操作,因为它可能会损坏数据。 –