守护线程什么时候有用?

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

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

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

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

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

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

希望能帮助到你。

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

一般来说,你不应该创build守护线程,除非你确定线程没有副作用。 既然你不能分辨线程什么时候停止,那么终结块将不会运行,任何堆栈也不会退出。 所以尽量避免在守护线程中使用IO操作,因为它可能会破坏数据。

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

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

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

Java中的守护进程线程就像其他线程或对象一样运行在守护线程所在的进程中。 守护线程用于后台支持任务,只有在正常线程正在执行时才需要。 如果正常的线程没有运行,剩余的线程是守护线程,那么解释器退出。

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