JAVA 守护线程

介绍

线程划分为了两类:

  • 用户线程 (User Thread),没有特殊设置的,都是用户线程
  • 守护线程 (Daemon Thread),需要特殊设置

守护线程

守护线程,对线程的一种标识。守护线程 为其他线程提供服务,如果剩下的全是守护线程时,java程序就退出

特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作

应用:最常见的守护线程:垃圾回收线程

总结:

  • 所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。
  • 只要非守护线程还在运行,程序就不会终止

设置守护线程

通过调用Thread类的setDaemon(true)方法来设置当前的线程为守护线程

注意:

  1. 方法 setDaemon(true) 必须在 start() 方法之前调用,否则会抛出IllegaThreadStateException异常。

  2. 不是所有的任务都可以分配给守护线程来执行,比如:读写操作或者计算逻辑。

提示

默认创建的线程为 非守护线程,即:用户线程

在守护线程中,创建的新线程也是 守护线程

例子:

Runnable接口实现类

public class DaemonThread implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<=100000;i++){
            System.out.println("守护线程:"+i);
        }
    }
}

启动类

public class DaemonThreadMain {
    public static void main(String[] args) {
        Thread t=new Thread(new DaemonThread());
        t.setDaemon(true);
        t.start();
        for(int i=0;i<=300;i++){
            System.out.println("主线程:"+i);
        }
    }
}

执行结果如下:

守护线程:59
主线程:297
守护线程:60
主线程:298
守护线程:61
主线程:299
守护线程:62
主线程:300
守护线程:63
守护线程:64
守护线程:65
守护线程:66
守护线程:67
守护线程:68

主线程运行结束后,守护线程也会结束(守护线程不会立即结束)

判断是否为守护线程

final boolean isDaemon()

原文出处:/show_1EF4uOWphbCJ.html