回答
当所有正在运行的线程都是守护程序线程时,JVM将退出。所以想象你正在写一个简单的游戏,在你的主要方法循环直到你决定退出。想象一下,在游戏开始时,您会启动一个线程,该线程将无休止地轮询某个网站以触发警报。当您决定结束游戏时,您希望JVM退出。您不希望无限轮询阻止游戏结束。所以你让这个轮询线程成为一个守护线程。
当所有“正常”线程终止时,Deamon线程将被JVM自动终止。普通线程永远不会自动终止。
您希望通过基本用户线程向用户提供的没有任何用户交互的服务构成将用户线程设置为守护进程的主要用例。
因此,直到用户线程存在JVM保证守护进程线程连续运行。你可以找到像GC,UI线程等例子。这些都是守护进程。
希望它有帮助。
正常情况下,程序在所有线程退出run()
方法时终止。守护程序线程不会阻止程序终止,即使它们仍在运行,即执行run()
。
因此,如果您希望在线程仍在运行时不阻止程序终止,则应该使用守护进程线程。例如对于长期的周期性任务来说,这是典型的,但实际上非常依赖于您的计划,设计和品味。
正如其他人所指出的,当该线程仍在运行时,守护线程不会阻止JVM在程序完成时退出。
一般来说,你不应该创建守护线程,除非你完全确定线程没有副作用。由于您无法确定线程什么时候停止,所以终结块将不会运行,也不会解开任何栈。因此,请尽量避免在守护进程线程中使用IO操作,因为它会破坏数据。
我用它们与计时器删除不能立即删除的文件。也就是说,我生成.exe文件,运行并删除它们。但是有50%的机会失败,看起来是因为图像仍然被终止进程阻止。只有在完成处理后才能可靠地删除可执行映像。但是,你永远不知道需要多长时间。因此,您设置.deleteOnExit而不是.delete。但是,你不想等到Java机器终止。它可能需要很长时间,并且不需要数百万无用的愚蠢的.exe文件,您不再需要,挂在文件系统中。因此,您需要在计时器中安排executable.delete以在两秒钟后发生。然而,定时器不能是通常的线程。如果是这样,即使没有要删除的文件,它也会阻止程序终止。然而,我可以很容易地使它成为守护进程,因为无论我的文件是否被删除或不是由定时器都是非重要的 - 文件将被删除,无论是通过守护进程或Java退出。我认为这是守护进程的完美使用。
Java中的守护进程线程就像一个服务提供程序,用于其他线程或与守护进程线程在同一进程中运行的对象。守护线程用于后台支持任务,只有在正常线程正在执行时才需要。如果普通线程没有运行,剩余的线程是守护线程,则解释器退出。
当一个新的线程被创建时,它会继承它父进程的守护进程状态。普通线程和守护进程线程在退出时会发生什么变化。当JVM停止任何剩余的守护进程线程时,抛弃:finally块不会被执行,堆栈不会被解除 - JVM刚刚退出。由于这个原因,应该谨慎地使用守护进程线程,并且将它们用于可能执行任何类型的I/O的任务是危险的。
尝试避免在守护进程线程中使用IO操作,因为它可能会损坏数据。 –
- 1. 守护线程是什么意思?
- 2. 守护线程
- 3. java线程 - 守护线程?
- 4. 守护线程Java
- 5. 守护线程垃圾收集器的父线程是什么?
- 6. 哈希轮定时器#1的守护线程是什么?
- 7. java守护进程线程
- 8. 什么时候守卫表情适当?
- 9. 守护进程线程什么也不做
- 10. 为什么VisualVM在Linux上不显示守护程序线程?
- 11. 守护线程执行
- 12. 守护线程说明
- 13. 守护程序线程 - 使用案例
- 14. Java中的守护进程和非守护线程优先级
- 15. Python的守护程序:检查有一个守护进程运行在任何时候都
- 16. Docker守护进程需要什么?
- 17. 为什么不是sidekiq守护进程?
- 18. 了解什么是PHP守护进程
- 19. 什么是adb守护进程?
- 20. 什么是“推理守护进程”?
- 21. 什么时候线程死在ThreadPoolExecutor中
- 22. 线程什么时候退出?
- 23. 什么时候线程安全问题?
- 24. 调用守护进程时为什么不返回Python check_output()?
- 25. 关于守护线程提供非守护线程一些服务
- 26. Java的守护线程使用JNI
- 27. 等待守护线程挂起应用
- 28. 什么时候有效地使用线程
- 29. 什么时候CopyOnWriteArraySet对实现线程安全的HashSet有用?
- 30. 什么时候使用线程有意义
在你的例子中,当用户决定结束游戏时,如果有用户线程(而不是守护进程线程)仍在运行,那么JVM块是否会继续运行? – Kal
@Kal:是的,这是它的工作方式。用户线程会阻止JVM关闭。 –
是的:如果主要方法简单地返回,JVM将继续运行。当然,如果您调用System.exit,它将停止运行。 –