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


相关推荐

  • mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)「建议收藏」

    mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)「建议收藏」首次接触python,感觉比PHP更加实用,适用性更佳广泛。不局限于网站建设,搭建服务器。选择性更佳广。接下来告诉新手宝宝们,怎么在mac和window上安装python软件Pycharm一、Pycharm安装教程:Pycharm官网下载地址:https://www.jetbrains.com/pycharm/1、点击官网地址下载—如图所示,点击下面2,选择你电脑对应的系统下载。window电脑就…

    2022年8月28日
  • GIMP教程 4 图层「建议收藏」

    GIMP教程 4 图层「建议收藏」图层可以说是现代制图软件的精髓,也是最根本地区别于纸质制图的地方。GIMP呼出图层窗口的方法也很简单点击【窗口—-可停靠对话框—-图层】或者直接使用快捷键ctrl+L 便可呼出图层窗口剩下的,就跟所有其它制图软件一样了。还有问题可联系作者(QQ616057653)进行交流。…

    2022年6月14日
  • Lua使用心得(2)

    在lua脚本调用中,如果我们碰到一种不好的脚本,例如:while1dodoend那我们的程序主线程也会被阻塞住。那我们如何防止这种问题呢?下面就给出一个解决的办法。首先为了不阻塞主线程,

    2021年12月25日
  • SIGPIPE[通俗易懂]

    SIGPIPE[通俗易懂]当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试.  但是服务器总是莫名退出,没有core文件.最后问题确

    2022年5月7日
  • 第一次安装android studio时候弹出unable to access android sdk add-on list解决方法

    第一次安装android studio时候弹出unable to access android sdk add-on list解决方法

    2021年9月30日
  • OpenCv函数学习(一)[建议收藏]

    IntelImageProcessingLibrary(IPL)位深度在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深度来表示的。黑白二色的图像是数字图像中最简单的一种,它只有黑

    2021年12月18日

发表回复

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

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