thread 守护线程_守护线程与非守护线程

thread 守护线程_守护线程与非守护线程  Java中线程分为用户线程(userthread)和守护线程(daemonthread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。  一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程”继承”daemon属性,见Thread.init方法:Threadparent=currentThread();this.daemon=parent.isDaemon();  当虚拟机中剩余运行

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

  Java中线程分为用户线程(user thread)和守护线程(daemon thread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。
  一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程”继承”daemon属性,见Thread.init方法:

Thread parent = currentThread();
this.daemon = parent.isDaemon();

  当虚拟机中剩余运行的都是守护线程时,JVM会退出;只要存在至少一个用户线程,JVM就不会退出。可以在Thread.start之前调用Thread.setDaemon方法设置线程属性(用户线程/守护线程)。
  只能在Thread未开始运行之前设置daemon属性,如果Thread已经开始运行,再设置daemon会抛出IllegalThreadStateException异常,见Thread.setDaemon方法:

public final void setDaemon(boolean on) { 
   
        checkAccess();
        if (isAlive()) { 
   
            throw new IllegalThreadStateException();
        }
        daemon = on;
    }

  例1:thread是用户线程,主线程结束后,thread会继续运行

public static void main(String[] args) throws Exception { 
   
        Thread thread = new Thread(new Runnable() { 
   
            @Override
            public void run() { 
   
                while (true) { 
   
                    try { 
   
                        Thread.sleep(1000L);
                        System.out.println("still running.");
                    } catch (InterruptedException e) { 
   
                        e.printStackTrace();
                    }
                }
            }
        });
        //设置线程为用户线程
        thread.setDaemon(false);
        thread.start();
        Thread.sleep(3000L);
        System.out.println("主线程退出");
    }

//输出
still running.
still running.
主线程退出
still running.
still running.
still running.
still running.

  例2:thread是守护线程,主线程结束后,thread会随即停止

    public static void main(String[] args) throws Exception { 
   
        Thread thread = new Thread(new Runnable() { 
   
            @Override
            public void run() { 
   
                while (true) { 
   
                    try { 
   
                        Thread.sleep(1000L);
                        System.out.println("still running.");
                    } catch (InterruptedException e) { 
   
                        e.printStackTrace();
                    }
                }
            }
        });
        //设置线程为守护线程
        thread.setDaemon(true);
        thread.start();
        Thread.sleep(3000L);
        System.out.println("主线程退出");
    }

//输出
still running.
still running.
主线程退出

  GC线程就是一个守护线程,保持低优先级进行垃圾回收,不依赖系统资源,当所有用户线程退出之后,GC线程也就没有什么用了,会随即退出。因为如果没有用户线程了,也就代表没有垃圾会继续产生,也就不需要GC线程了。
  可以简单理解成守护线程为用户线程服务,当所有用户线程结束,也就不需要守护线程了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181592.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vps自建_七牛云搭建图床

    vps自建_七牛云搭建图床目的:将一些小服务应用部署到免费的serverless/VPS上去环境:0成本实现方式:github+vercel/freewha效果:项目一:个人导航项目二:个人博客项目三:个人音乐服务器:背景:上面的项目以前我都是部署在家里群晖上,或者VPS上,但是FRPC和VPS的流量,延时、运维更新等问题,实际用起来很繁琐,最近两年serverless发展很火,于是就萌生了把他们部署到免费的VPS或者serverless产品上网络上有很多hexo博客部署到vercel、github.

    2025年6月11日
    3
  • DOS命令COPY与XCOPY有什么区别「建议收藏」

    DOS命令COPY与XCOPY有什么区别「建议收藏」内部命令COPY与外部命令XCOPY在作用及使用方法上有什么区别?首先说一下内外部命令的区别,内部命令是在启动DOS后调入计算机内存中常驻的,外部命令是刻在磁盘上面的,使用时内部命令可以在每一个盘符下从内存直接执行,而外部命令执行时除了外部命令所在目录及设定好路径的盘符下执行外,在其它位置执行都需要指明此命令所在路径,执行时都是从磁盘调入内存来执行。至于COPY和XCOPY的区别是:用

    2022年7月18日
    16
  • @ResponseBody注解作用与原理「建议收藏」

    @ResponseBody注解作用与原理「建议收藏」1、概念注解@ResponseBody,使用在控制层(controller)的方法上。2、作用作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。如果返回值是字符串,那么直…

    2022年5月8日
    87
  • 多层感知机详解(如果增加多层感知机的隐藏层层数)

    Principlesoftrainingmulti-layerneuralnetworkusingbackpropagation  Theprojectdescribesteachingprocessofmulti-layerneuralnetworkemploying backpropagation algorithm.Toillustrateth…

    2022年4月11日
    126
  • spooling技术介绍

    spooling技术介绍SPOOLing(SimultaneousPeripheralOperationOn-Line)技术,即外部设备联机并行操作,是为实现低速输入输出设备与高速的主机之间的高效率数据交换而设计的。通常称为“假脱机技术”,又称为排队转储技术。  具体来说,SPOOLing技术在输入输出之间增加了“输入井”和“输出井”的排队转储环节,以消除用户的“联机”等待时间。而所谓“输入井”和“输出井”则是在高…

    2025年8月18日
    3
  • 解决cookie跨域访问_cookie 跨域

    解决cookie跨域访问_cookie 跨域浏览器对于javascript的同源策略(请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.)的限制,例如a.cn下面的js不能调用b.cn中的js,对象或数据(因为a.cn和b.cn是不同域),但是在前后端分离时我们经常会把服务端和前端放到不同域上,这时就需要跨域了.今天记录的是cookie的跨域访问。问题在此之前一直以为传统的服务器使用se…

    2022年10月1日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号