携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
本篇文章我们来了解一下守护式线程。
守护线程的概念
我们来看一下守护式线程的源码:
这英文注释是java虚拟机退出,当线程都是守护线程的时候
这里是校验访问权限,然后设置标识。
守护线程实验
这是守护式线程的代码,如下:
Thread daemon = new Thread(()->{
int i = 0;
while(i<10){
i++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("this is daemon thread !");
}
});
daemon.setDaemon(true);
daemon.start();
这是用户线程的代码如下:
Thread user = new Thread(()->{
int i = 0;
while(i<3){
i++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("this is user thread !");
}
});
user.setDaemon(false);
user.start();
打印结果如下:
按我们的逻辑来讲,守护式线程应该打印10次才结束,但是当用户线程结束的时候,守护式线程的任务也就完成了,当全是守护式线程的时候,虚拟机就自动退出了,如果我们想让守护式线程执行的更久的话,可以尝试让main线程睡眠,我们可以借此思考一下:main线程是守护式线程吗?很明显,main线程是用户式线程。
执行这段语句告诉我们是false。
Thread.currentThread().isDaemon()
销毁java虚拟机线程
我们断点调试发现,当main线程结束的时候,一个虚拟机销毁的线程就被创建出来
这个线程会进行资源的回收,同时会监控应用中的用户线程是不是大于1,就等待,每个用户线程跑完,都会判断当前应用剩几个用户线程,如果剩一个,就唤醒,然后就进行销毁虚拟机操作。