✨✨hello,愿意点进来的小伙伴们,你们好呐!
🐻🐻系列专栏:【JavaEE初阶】
🐲🐲本篇内容:详解守护线程
🐯🐯作者简介:一名现大二的三非编程小白,日复一日,仍需努力。
- Daemon 线程 介绍:
- Daemon 线程的 构造:
- 演示 Daemon 线程 :
- Daemon 线程 注意事项:
Daemon 线程 介绍:
Daemon 线程 就是 我们经常听说到的 守护线程
🚗🚗🚗
该Daemon 线程 是一个支持型的线程 , 可以理解为Daemon 线程 支持了Java程序进程的后台调度, 只要在 程序中只存在Daemon 线程 执行,那么该程序就会退出程序,并销毁进程
🚓🚓🚓
相反的是当一个程序存在非Daemon 线程 时,那么这个程序就会等待非Daemon 线程 执行结束后再销毁进程
Daemon 线程的 构造:
🚕🚕🚕
Daemon 线程 是我们在创建线程的时候设置的,只有在启动线程之前设置,无法在启动线程后设置
Daemon 线程 是通过 setDaemon(true)
方法来设置的
演示 Daemon 线程 :
🚙🚙🚙
接下来我们来看看守护线程与非守护线程的区别
先来看看非守护线程:
public class ThreadDemo26 {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("设置守护线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Daemon");
/* thread.setDaemon(true);*/
thread.start();
}
}
🚌🚌🚌
我们没有使用设置 Daemon 线程的方法,这个时候线程的运行就会发现,输出正常输出,且使用 jconsole 工具也可以看得到进程与线程正在执行
那这个时候除了我们创建的线程外为什么还有那么多线程呢?
其实这些线程都是JVM自带的线程,当一个进程创建的时候,就会有这些线程的创建,随着进程的执行结束,这些线程就随着销毁,由此可见,这些由JVM自带的线程都是 Daemon线程,不会影响进程的结束
🚐🚐🚐
接下来我们来`设置Daemon线程来观察一下会发生哪些变化
public class ThreadDemo26 {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("设置守护线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Daemon");
thread.setDaemon(true);
thread.start();
}
}
我们会发现,运行程序后,好像就程序直接结束了,然后在 jconsole 工具也找不到进程了
其实这个时候,在main线程中调用了Daemon线程,然后main线程结束后,Daemon线程又是守护线程,那么这个时候Daemon线程不会阻止进程的结束执行,所以进程就结束了,相对着,Daemon线程也是销毁的
🚎🚎🚎
Daemon线程随之main线程的执行完毕而终止
Daemon 线程 注意事项:
🚒🚒🚒
构建 Daemon线程还需要注意一点:
不能依靠finally块来做释放资源的操作;
public class ThreadDemo26 {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("设置守护线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("Daemon线程执行 finally");
}
}
}, "Daemon");
thread.setDaemon(true);
thread.start();
}
}
执行结果我们可以看到,程序并不会执行到finally块中的内容,所以我们在这里要慎重使用