java守护线程及其应用

java线程分为两种 :用户线程(User Thread)和守护线程(Daemon Thread)。

平时我们常用的就是用户线程,而守护线程很少用到,只有在一些特定场景中用到。守护线程一般是用来为其他线程服务的,比如JVM的垃圾回收,就是一个守护线程,为其他线程回收垃圾对象等。

守护线程的特点:生命周期依赖于其他线程,当最后一个用户线程结束后,守护线程就会强制结束,以前喜欢看玄幻小说,是不是很像小说中的主仆协议,主人死了,宠物也要死

代码

		System.out.println("主线程运行开始");
        Thread thread = new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                while (true) {
    
    
                    System.out.println("用户线程运行中");
                    try {
    
    
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.start();
        System.out.println("主线程运行结束");

结果

主线程运行开始
主线程运行结束
用户线程运行中
用户线程运行中
用户线程运行中
用户线程运行中
用户线程运行中
用户线程运行中

通过上面代码的执行结果来看,主线程结束后,但是用户线程依然运行,JVM无法退出

代码

		System.out.println("主线程运行开始");
        Thread thread=new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                while (true){
    
    
                    System.out.println("守护线程运行中");
                    try {
    
    
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.setDaemon(true);
        thread.start();
        System.out.println("主线程运行结束");

结果

主线程运行开始
守护线程运行中
主线程运行结束

但是如果是一个守护线程,主线程结束后,守护线程就会强制结束,非常适合执行一些后台任务

实际应用场景:记得18年刚工作的时候,当时负责一个养老平台开发,对接一个床垫,老人睡眠心率、血压、睡眠状况会通过大屏展示,数据采集是实时的,数据采集是通过一个while死循环加sokect获取,采用守护线程的方式,因为主程序结束后,数据采集也就没有意义了

猜你喜欢

转载自blog.csdn.net/qq_38306425/article/details/109159772
今日推荐