15.0、Java多线程——守护线程
守护线程->daemon
1、线程分为两种
用户线程
和
守护线程
2、虚拟机必须确保用户线程执行完毕
比如说我们的main主线程就是用户线程,当我们的 main() 执行完毕程序就结束了
3、虚拟机不用等待守护线程执行完毕
比如说 gc() 垃圾回收线程就是守护线程,虚拟机不需要等待他执行完毕,我们不需要管他甚至都看不见他,虚拟机只要等待正常的用户线程执行结束了就会停止
4、守护线程的作用如:后台记录操作日志、监控内存、垃圾回收等等……
下面来看看代码是如何测试的,实现代码如下所示:
TestDaemon.java文件:
package com.hkl.state;
public class TestDaemon {
public static void main(String[] args) {
Guard guard = new Guard();
User user = new User();
//将 Guard 线程类设置为守护线程,在开启该线程
Thread thread = new Thread(guard);
thread.setDaemon(true);
thread.start();
//开启用户线程
new Thread(user).start();
}
}
//守护线程
class Guard implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("守护中...");
}
}
}
//用户线程
class User implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("用户线程运行中...");
}
System.out.println("用户线程执行结束...");
}
}
想要将我们自定义的线程类变成
守护线程
就需要将 Thread.setDaemon(true); 设置为
true
线程的 Daemon 默认设置是 false,也就是
用户线程
1、下面来看看我们 部分 后台输出结果,如下:
这里能够看到:当我们的用户线程还在执行尚未结束的时候,守护线程也会一直执行下去
2、再来看看 用户线程 执行完毕时的运行截图,如下所示:
可以看到 当
用户线程
执行完毕之后
守护线程
也随之停止,没有马上停止的原因是因为虚拟机停止也需要一点时间。