什么是守护线程 ? | Java Debug 笔记

239 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题

Java 中的守护线程是什么?

回答

回答 1

守护线程指为其他线程服务的线程,在 JVM 中,所有非守护线程都执行完毕后,无论有无后湖线程,虚拟机都会自动退出,最典型的一个案例就是垃圾回收。

我们可以使用 setDeamon(boolean) 方法在线程启动前更改 Thread 守护线程属性。

回答 2

还有一些值得需要注意的点:(参考

  • 创建新线程时,它将继承其父类的守护进程状态;
  • 当所有非守护线程完成后,JVM 停止运行,然后剩余的守护线程都将被放弃;

基于上述原因,在使用守护线程时一定要谨慎,而且将守护线程用于任意类型的涉及 IO 的任务都是十分危险的。

回答 3

楼上的回答都讲的十分到位。以下举个小例子来说明其中的区别。我们尝试将 setDaemon(boolean) 方法中的参数设置为 truefalse 来看它们的区别。

public class DaemonTest {

    public static void main(String[] args) {
        new WorkerThread().start();

        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {
            // 处理异常
        }

        System.out.println("Main Thread ending") ;
    }

}

class WorkerThread extends Thread {

    public WorkerThread() {
        // 参数为 false, (假设此时无任何守护线程)
        // WorkerThread 继续执行
        // 参数为 true, (假设此时是一个守护线程),
        // WorkerThread 会在 main 线程或者用户自定义线程(非守护线程)终止时而随之终止
        setDaemon(true); 
    }

    public void run() {
        int count = 0;

        while (true) {
            System.out.println("Hello from Worker "+count++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
    }
}

回答 4

传统意义上来讲,UNIX 中的守护线程一般是指那些在后台运行的线程,类似于 Windows 中的服务。

Java 中的守护线程指的是那些不会阻止 JVM 退出的线程。特别的,如果只剩下守护线程时,JVM 将退出。我们可以通过调用 Thread 中的 setDeamon() 方法来创建一个守护线程。

出处

文章翻译自 Stack Overflow:What is a daemon thread in Java?