【Java】多线程 - 守护线程(Daemon Thread)

Posted by 西维蜀黍 on 2019-02-26, Last Modified on 2021-09-21

守护线程(Daemon Thread)

在 Java 中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)。

用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆。

只要当前 JVM 实例中还存在任何一个没有结束的非守护线程,守护线程就仍然工作。只有当最后一个非守护线程结束时,守护线程随着 JVM 一同结束而结束。 守护线程的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于是否导致 JVM 的结束:如果用户线程已经全部退出运行了,只剩下守护线程存在了,JVM 也就退出了。 因为没有被守护者了,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

创建守护进程

值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。

Thread daemonTread = new Thread();
 
  // 设定 daemonThread 为 守护线程,default false(非守护线程)
 daemonThread.setDaemon(true);
 
 // 验证当前线程是否为守护线程,返回 true 则为守护线程
 daemonThread.isDaemon();

这里有几点需要注意:

  • IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
  • 在守护线程中产生的新线程也是守护线程的。
  • 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。

当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。

Reference