守护线程和用户线程

上一篇:线程死锁

守护线程和用户线程

概述:
Java中的线程分为两类【daemon】守护线程和【user】用户线程;在JVM启动时会调用main函数,main函数所在的线程就是一个用户线程,其实在JVM内部还同时启动了很多守护线程,比如垃圾回收线程。

区别:
当最后一个用户线程结束时JVM正常退出,不论是否有守护线程在执行,即程序是否退出和是否存在未运行结束的守护线程无关;而当用户线程没有执行完JVM则不会退出;换句话说JVM是否退出只与用户线程有关

代码示例:

package com.dwk.thread;

/**
 * @author duweikun
 * @describe 守护线程
 * @date 2021/10/15
 */
public class DaemonThreadTest {

    /**
     * 创建一个守护线程
     * @return
     */
    public Thread creatOneDaemonThread(){
        Thread daemonThread = new Thread(()->{
            System.out.println("守护线程");
            //让守护线程死循环
            while (true){}
        });
        //设置线程为守护线程
        daemonThread.setDaemon(true);
        return daemonThread;
    }

    /**
     * 测试守护线程和用户线程
     */
    public void test() throws InterruptedException {

        Thread thread = new Thread(() -> {
            System.out.println("用户线程");
        });

        Thread daemonThread = this.creatOneDaemonThread();

        daemonThread.start();
        thread.start();
    }

    public static void main(String[] args) throws InterruptedException {
        DaemonThreadTest daemonThreadTest = new DaemonThreadTest();
        daemonThreadTest.test();
        System.out.println("程序结束");
    }

}


执行结果:
在这里插入图片描述

可以看到先输出了程序结束,这是因为JVM启动的时候调用main函数,main是一个主线程,main里面创建的是它的子线程,而线程之间要是没有共用对象的话是不会互相影响的,,从这个地方也可以说明,父线程的结束不会影响子线程的运行;

程序中设置守护线程进入死循环,按道理一个线程没有执行完程序是不会结束的,但是在用户线程结束之后,程序运行结束了,说明程序的退出与否只与用户线程有关。

总结:当前进程中不存在用户线程,但是存在执行中的守护线程,JVM不等待守护线程结束就会终止JVM进程;然后在使用的时候,如果想要mian函数结束就终止程序的话可以将用户线程都设置成守护线程;

ps:其实书上还介绍了为什么main函数结束后会等待其他用户线程执行结束后才终止JVM进程,这里就不详细介绍了,简单点说就是JVM启动时调用main函数的同时开启了一个DestroyJavaVm的线程,这个线程会等待所有的用户线程结束后终止JVM进程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值