一、简介
线程可以分为:普通线程 和 守护线程
普通线程和守护线程之间的差异在于:当线程退出时发生的操作。
(1)问题
1. 什么时候使用守护线程?
希望创建一个线程来执行一些辅助工作,但又不希望这个线程阻碍 JVM 的关闭
2. 有哪些常见的守护线程?
在 JVM 启动时创建的所有线程中,除了主线程以外,其他的线程都是守护线程(例如垃圾回收器以及其他执行辅助工作的线程)
3. 如何设置守护线程?
Thread.setDaemon(true);
默认情况下,主线程创建的所有线程都是普通线程。
4. 为什么少使用守护线程?
当一个线程退出时,JVM 会检查其他正在运行的线程,如果这些线程都是守护线程,那么 JVM会正常退出操作。
当 JVM 停止时,所有仍然存在的守护线程都将被抛弃 —— 既不会执行 finally
代码块,也不会执行回卷栈,而 JVM 只是直接退出。
尽少用守护线程,因为很少有操作能够在不进行清理的情况下被安全地抛弃。
此外,守护线程通常不能用来替代应用程序管理程序中各个服务的生命周期。
所以,当创建线程时,需要考虑清楚之后的清理、异常等情况。
二、案例
public class DaemonDemo {
public static class DaemonT extends Thread {
public void run() {
while (true) {
System.out.println("I am alive");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread t = new DaemonT();
t.setDaemon(true);
t.start();
Thread.sleep(2000);
}
}
输出结果如下:
I am alive
I am alive
I am alive
// Process finished with exit code 0
若不设置 t.setDaemon(true);
, 即不设置为 用户线程,t线程会运行下。