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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java python哪个好_java和python哪个更好用?(一)[通俗易懂]

    java python哪个好_java和python哪个更好用?(一)[通俗易懂]JavaJava是世界上最古老,功能最强大的编程语言之一。它是一种通用的静态类型的语言。这意味着任何人都可以使用它。使用此编程语言没有特定的目的。Java还是一种面向对象的编程语言。这使其成为易于使用的编程语言之一。Java还是一种可移植的编程语言,可以在WORA上运行(一旦在任何地方运行,编写一次)。这意味着您可以在特定计算机上编写Java程序,并在任何平台上使用它。您需要拥有Java虚拟机(…

    2022年7月8日
    22
  • phpstorm2021.5.3 激活码[在线序列号]

    phpstorm2021.5.3 激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    59
  • ElasticSearch最新版快速入门详解「建议收藏」

    ElasticSearch最新版快速入门详解「建议收藏」本文把最新版的ElasticSearch和kibana的知识点用通俗易懂的语言来展现,并会在核心概念上和MySql对比,结合示例进行图文并茂的详解,同时还给大家提供百分百成功的极速安装配置方法哦!

    2022年4月30日
    47
  • 怎么关闭135 445端口_高危端口关闭方法

    怎么关闭135 445端口_高危端口关闭方法关闭135,139,445高危端口方法方法一:防火墙关闭高危端口其一:拒绝所有IP访问135、139、445端口1、打开“控制面板”→打开“系统和安全”→打开“系统和安全”→打开“windows防火墙”2、点击“高级设置”3、选中“入站规则”→鼠标右点击“新建规则”4、选择“端口”–>下一步5、在红色框中特定本地端口输入“135,139,445” –下一步…

    2022年10月17日
    0
  • 利用番茄钟来求职「建议收藏」

    利用番茄钟来求职「建议收藏」利用番茄钟来求职

    2022年4月21日
    38
  • 华为交换机链路聚合trunk_华为删除链路聚合命令

    华为交换机链路聚合trunk_华为删除链路聚合命令文章目录一、为什么要用到聚合二、链路聚合三、拓扑四、基本配置五、部署LinkAggregation-链路聚合一、为什么要用到聚合1、二层环境为什么要用到聚合(1)接入层的流量剧增;(2)现行存储数据剧增;(3)监控网络运行大数据流量;

    2025年7月27日
    3

发表回复

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

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