守护线程初解析

284 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

本篇文章我们来了解一下守护式线程。

守护线程的概念

我们来看一下守护式线程的源码: image.png

这英文注释是java虚拟机退出,当线程都是守护线程的时候 image.png

这里是校验访问权限,然后设置标识。

守护线程实验

这是守护式线程的代码,如下:

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();

打印结果如下:

image.png

按我们的逻辑来讲,守护式线程应该打印10次才结束,但是当用户线程结束的时候,守护式线程的任务也就完成了,当全是守护式线程的时候,虚拟机就自动退出了,如果我们想让守护式线程执行的更久的话,可以尝试让main线程睡眠,我们可以借此思考一下:main线程是守护式线程吗?很明显,main线程是用户式线程。

执行这段语句告诉我们是false。

Thread.currentThread().isDaemon()

image.png

销毁java虚拟机线程

我们断点调试发现,当main线程结束的时候,一个虚拟机销毁的线程就被创建出来 image.png

这个线程会进行资源的回收,同时会监控应用中的用户线程是不是大于1,就等待,每个用户线程跑完,都会判断当前应用剩几个用户线程,如果剩一个,就唤醒,然后就进行销毁虚拟机操作。