image.png

一、什么是守护线程

Java 提供了两种类型的线程:守护线程用户线程

  • 用户线程 是高优先级线程。JVM 会在终止之前等待任何用户线程完成其任务。
  • 守护线程 是低优先级线程。其唯一作用是为用户线程提供服务。

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

二、守护线程有什么作用

守护线程的作用是为用户线程提供服务,并且仅在用户线程运行时才需要,因此一旦所有用户线程完成执行,JVM 就会终止。也就是说 守护线程不会阻止 JVM 退出
常见的做法,就是将守护线程用于后台支持任务,比如垃圾回收、释放未使用对象的内存、从缓存中删除不需要的条目。

三、如何使用守护线程

Java的Thread线程类中提供了API:

  1. /*
  2. 将此线程标记为守护程序线程或用户线程。
  3. 当所有正在运行的线程都是守护程序线程时,Java虚拟机将退出。
  4. 必须在线程启动之前调用此方法。
  5. */
  6. public final void setDaemon(boolean on) {
  7. checkAccess();
  8. if (isAlive()) {
  9. throw new IllegalThreadStateException();
  10. }
  11. daemon = on;
  12. }

要想创建一个守护线程,只需要调用该方法即可。
e.g.

  1. Thread daemonThread = new Thread();
  2. daemonThread.setDaemon(true);
  3. daemonThread.start();

四、补充

1.在 Java 语言中,线程的状态是自动继承的。

任何线程都会继承创建它的线程的守护程序状态。即:

  • 如果一个线程是普通线程( 用户线程) ,那么它创建的子线程默认也是普通线程( 用户线程 )。
  • 如果一个线程是守护线程,那么它创建的子线程默认也是守护线程。

    2.守护线程中执行操作需要注意:

    通常存在于守护线程中的无限循环不会导致问题,因为任何代码(包括 finally 块 )都不会在所有用户线程完成执行后执行。
    并不推荐 在守护线程中执行 I/O 任务 。因为可能导致无法正确关闭资源。

参考资料: 一文秒懂 Java 守护线程 ( Daemon Thread ) java并发编程:之守护线程(Daemon)