在 Java 中,守护线程(Daemon Thread)是一种在后台运行的线程,它的主要作用是为其他线程提供服务和支持。例如,垃圾回收线程就是一个典型的守护线程。守护线程的一个重要特性是:当所有非守护线程(用户线程)都结束时,Java 虚拟机 (JVM) 会自动退出,无需等待守护线程的结束。
守护线程的特点和使用场景包括:
-
后台服务:
- 守护线程通常用于执行后台服务任务,例如垃圾回收、日志记录等。
-
自动结束:
- 当 JVM 中的所有非守护线程都结束时,守护线程会自动终止并且 JVM 会退出。
-
设置守护线程:
- 可以通过调用线程对象的
setDaemon(true)
方法来将一个线程设置为守护线程,必须在启动线程之前调用。
- 可以通过调用线程对象的
-
与非守护线程的区别:
- 守护线程在所有非守护线程结束后自动终止,而非守护线程则是需要显式地终止或者运行结束。
以下是一个示例代码,展示了如何创建和使用守护线程:
public class DaemonThreadDemo {
public static void main(String[] args) {
Thread daemonThread = new Thread(() -> {
while (true) {
System.out.println("Daemon thread is running...");
try {
Thread.sleep(1000); // 模拟后台任务
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 将线程设置为守护线程
daemonThread.setDaemon(true);
daemonThread.start();
// 主线程休眠2秒,然后结束
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread is ending...");
}
}
在这个示例中:
- 创建了一个新的线程
daemonThread
,它会在后台不断打印 “Daemon thread is running…”。 - 使用
setDaemon(true)
将这个线程设置为守护线程。 - 启动守护线程。
- 主线程休眠 2 秒钟后结束。
当主线程结束后,守护线程会自动终止,因为没有其他非守护线程在运行,JVM 也随之退出。通过这个示例,可以看到守护线程在后台运行,并且会随着主线程的结束而自动终止。