Skip to content

守护线程(Daemon Thread)是在后台运行的线程,当所有非守护线程都结束时,守护线程会自动退出。与之相对的是用户线程(Non-daemon Thread),用户线程不会随着其他线程的结束而自动退出。

创建守护线程的方法是通过将线程对象的setDaemon(true)方法设置为true来实现。默认情况下,线程对象是非守护线程。

守护线程通常用于执行一些辅助性任务,比如垃圾回收、日志记录等。它们在后台默默地工作,不会阻止程序的退出。

需要注意的是,守护线程不能访问任何非守护线程中的资源,因为它们可能在任意时间被终止。所以,在编写守护线程代码时要小心处理共享资源的同步问题。

下面是一个简单的Java入门案例,演示了如何创建和使用守护线程:

public class DaemonThreadExample {
    public static void main(String[] args) {
        // 创建一个守护线程对象
        Thread daemonThread = new Thread(new MyDaemonRunnable());
        
        // 将线程设置为守护线程
        daemonThread.setDaemon(true);
        
        // 启动线程
        daemonThread.start();
        
        // 主线程休眠一段时间
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("主线程结束");
    }
}

class MyDaemonRunnable implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("守护线程正在运行");
            
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这个例子中,我们创建了一个名为MyDaemonRunnable的实现了Runnable接口的类。该类中的run()方法包含一个无限循环,在每次循环中打印一条消息,并且让线程休眠1秒钟。

DaemonThreadExamplemain()方法中,我们首先创建了一个MyDaemonRunnable对象,并将其传递给Thread的构造函数来创建一个新的线程对象daemonThread。然后,我们调用setDaemon(true)方法将该线程设置为守护线程。最后,我们启动守护线程。

主线程在启动守护线程后休眠5秒钟,然后打印一条结束消息。由于守护线程是后台运行的,当主线程结束时,守护线程也会随之结束。

请注意,在这个例子中,守护线程会无限循环地执行任务,直到程序退出或者它被强制终止。因为守护线程不会阻止程序的退出,所以如果你想要在守护线程中执行某些特定任务,请确保有适当的退出条件。