java中的用户线程和守护程序线程有什么区别?

时间:2013-01-11 06:25:24

标签: java thread-safety jvm

  

可能重复:
  What is Daemon thread in java
  When are daemon threads useful?

我对Java中用户线程和守护程序线程之间的区别感到困惑。

你能告诉我:

  1. Java中用户线程和守护程序线程之间有什么区别?
  2. 在哪种情况下会使用守护程序线程?你能给我一些例子吗?

3 个答案:

答案 0 :(得分:18)

一旦最后一个非jvm线程终止,JVM将退出。这意味着如果您创建的任何线程仍在运行,则jvm将不会关闭。 守护程序线程是不阻止JVM关闭的线程。通常你会将它们用于某些后台任务,如果用户要求它关闭,你不希望保留你的应用程序。

此外,您的问题已在此处被提问(并已回答) - What is Daemon thread in Java?

一些常见的(来自个人经验)守护程序线程的用例可能包括

  • 轮询远程系统以进行状态更改的后台线程
  • 后台工作线程(如发送电子邮件通知,snmp等等)
  • 用于执行预定维护的自定义计时器线程

答案 1 :(得分:4)

第二个问题:

当所有正常线程终止时,守护程序线程会自动终止。

您可以使用守护程序线程在应用程序中进行一些内务管理或清理。守护程序线程用于后台支持任务,仅在正常线程执行时才需要。 GC线程是守护程序线程。

答案 2 :(得分:1)

用户线程是由应用程序(用户)创建的线程,并且在大多数情况下,Java VM会创建一个守护程序线程来为用户线程提供服务。当用户线程退出时,VM区分线程,即用户或守护进程。如果用户线程退出VM,将检查是否有任何其他用户线程在运行。如果有,它将安排下一个线程(用户或守护进程)。如果没有其他用户线程在运行,并且只有守护程序线程,则该VM实例也将退出。

这两种类型的线程之间的区别很简单:如果Java运行时确定应用程序中运行的唯一线程是守护程序线程(即,没有用户线程存在),Java运行时会立即关闭应用程序,有效地阻止所有守护程序线程死在他们的轨道上。为了使应用程序继续运行,它必须始终至少有一个实时用户线程。在所有其他方面,Java运行时以完全相同的方式处理守护程序线程和用户线程。