【多线程】守护线程 Daemon

守护线程 Daemon

  • 线程分为用户线程守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如,后台记录操作日志,监控内存,垃圾回收等待..

代码示例:

/**
 * @Description 测试守护线程,上帝保佑着你
 * @Author hzx
 * @Date 2022-03-27
 */
public class TestDaemon {
    public static void main(String[] args) {
        TestGod god = new TestGod();
        TestYou you = new TestYou();

        Thread thread = new Thread(god);
        thread.setDaemon(true); //默认是false,表示是用户线程,正常的线程都是用户线程...
        thread.start(); //守护线程启动

        new Thread(you).start(); //你,用户线程启动
    }
}

class TestGod implements Runnable {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("上帝保佑着你");
        }
    }
}

class TestYou implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("你开心的活了"+i+"个纪元");
        }
        System.out.println("===========Goodbye!World!===========");
    }
}

执行结果:

上帝保佑着你
你开心的活了0个纪元
上帝保佑着你
你开心的活了1个纪元
上帝保佑着你
你开心的活了2个纪元
上帝保佑着你
你开心的活了3个纪元
上帝保佑着你
你开心的活了4个纪元
你开心的活了5个纪元
上帝保佑着你
你开心的活了6个纪元
上帝保佑着你
上帝保佑着你
你开心的活了7个纪元
上帝保佑着你
你开心的活了8个纪元
你开心的活了9个纪元
===========Goodbye!World!===========
上帝保佑着你
  • 一个守护线程什么时候结束不取决于主线程什么时候结束。守护线程的作用是在后台运行任务,只要还有一个以上非守护线程没有结束(即便此时主线程已结束),程序就不会结束。
  • 反过来,当所有非守护线程都结束了后,即便还有未结束的守护线程,系统也会马上结束这些守护线程,然后结束程序。

思考问题:当非守护线程执行结束的时候,为什么守护线程还会再接着执行一会儿再结束?

解释:单一线程当然是主程序语句结束,主程序结束,多线程是并行状态,主线程语句执行结束,其他线程执行时间可能大于主线程执行时间,所以主线程并没有关闭,等其他线程结束的收尾工作,结束线程也需要时间

posted @ 2022-03-27 16:17  HZX↑  阅读(49)  评论(0编辑  收藏  举报