并发-守护线程setDaemon()

目录

为什么存在

什么是守护线程

创建守护线程

在使用守护线程时需要注意以下几点

可以使用isDaemon()方法来检查线程是否是守护线程

例1:上面提到当JVM中只剩下守护线程的时候,JVM就会退出,那么写段代码测试下

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

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


为什么存在

  • Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程
  • 当所有线程都运行结束时,JVM退出,进程结束
  • 如果有一个线程没有退出,JVM进程就不会退出
  • 所以,必须保证所有线程都能及时结束
  • 但是有一种线程的目的就是无限循环
  • 例如,一个定时触发任务的线程:
  • 如果这个线程不结束,JVM进程就无法结束
  • 问题是,由谁负责结束这个线程?
  • 然而这类线程经常没有负责人来负责结束它们
  • 但是,当其他线程结束时,JVM进程又必须要结束,怎么办?
  • 答案是使用守护线程(Daemon Thread)
  • 守护线程是指为其他线程服务的线程
  • 在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出
  • 因此,JVM退出时,不必关心守护线程是否已结束

什么是守护线程

  • 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
  • 它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程
  • 用户线程一般用于执行用户级任务
  • 而守护线程也就是“后台线程”,一般用来执行后台任务
  • 并且这种线程并不属于程序中不可或缺的部分
  • 因此,当所有的非守护线程结束时,程序也就终止了
  • 同时会杀死进程中的所有守护线程
  • 反过来说,只要任何非守护线程还在运行,程序就不会终止
  • 守护线程最典型的应用就是GC(垃圾回收器)
  • 这两种线程其实是没有什么区别的
  • 唯一的区别就是Java虚拟机在所有<用户线程>都结束后就会退出,而不会等<守护线程>执行完
  • 当所有的非守护线程结束时,程序也就终止了
  • 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了
  • GC线程就是一个守护线程,保持低优先级进行垃圾回收,不依赖系统资源
  • 当所有用户线程退出之后,GC线程也就没有什么用了,会随即退出
  • 因为如果没有用户线程了,也就代表没有垃圾会继续产生,也就不需要GC线程了
  • 可以简单理解成守护线程为用户线程服务,当所有用户线程结束,也就不需要守护线程了

创建守护线程

  • 将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现,使线程成为一个守护线程

在使用守护线程时需要注意以下几点

  • 1-thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出一个IllegalThreadStateException异常
  • 你不能把正在运行的常规线程设置为守护线程
  • 2-在Daemon线程中产生的新线程也是Daemon的
  • 3-守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断,这会导致数据丢失

可以使用isDaemon()方法来检查线程是否是守护线程

  • 以上代码输出结果:

例1:上面提到当JVM中只剩下守护线程的时候,JVM就会退出,那么写段代码测试下

  • 以上代码中,我们在Main线程中开启了一个子线程
  • 在并没有显示将其设置为守护线程的情况下,他是一个用户线程
  • 代码比较好理解,就是子线程处于一个while(true)循环中,每隔一秒打印一次I'm child thread..
  • 输出结果为:
  • 我们再把子线程设置成守护线程,重新运行以上代码:
  • 以上代码,我们通过childThread.setDaemon(true);把子线程设置成守护线程,然后运行,得到以下结果:
  • 子线程只打印了一次
  • 也就是在main线程执行结束后,由于子线程是一个守护线程,JVM就会直接退出了
  • 值得注意的是,在Daemon线程中产生的新线程也是Daemon的

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325682.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

练习队列的相关操作:循环队列

1. 思路解析 循环队列就是在只有有限的空间时使用队列实现循环存储数据&#xff0c;有双向链表和数组两种选择&#xff0c;这里我们使用数组实现循环队列&#xff08;因为链表我不会 >-<&#xff09; 2. 相关函数及其实现 2.1 判空与判满 判空&#xff1a;直接返回头尾…

docker(四):数据卷

数据卷 卷的设计目的就是数据的持久化&#xff0c;完全独立于容器的生存周期&#xff0c;因此Docker不会在容器删除时删除其挂载的数据卷。 1、docker run docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名2、挂载注意事项 --privilegedtru…

【C++】二叉搜索树(手撕插入、删除、寻找)

一、什么是二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左…

OSError: [WinError 1455] 页面文件太小,无法完成操作 的问题

实质问题是报错&#xff1a;caffe2_detectron_ops.dll“ or one of its dependencies 还需要安装一个包&#xff1a; pip install intel-openmp 安装之后顺利测试通过。

Tomcat7+ 弱口令 后台getshell漏洞

1 漏洞背景 Tomcat 是一个流行的开源Web应用服务器&#xff0c;用于部署和运行Java Web应用程序。Tomcat 7 版本中存在一个安全隐患&#xff0c;即默认的管理员密码可能较弱或者未被修改&#xff0c;攻击者可以利用这一漏洞登录到Tomcat的管理后台&#xff0c;并上传恶意的WAR…

LeetCode100题总结

LeetCode100题总结 前言LeetCode100题总结题型梳理双指针11. 盛最多水的容器234.回文链表75.颜色分类206.反转链表142.环形链表215.三数之和 滑动窗口3. 无重复字符的最长子串209. 长度最小的子数组438. 找到字符串中所有字母异位词 广搜102. 二叉树的层序遍历200. 岛屿数量617…

轮转数组 与 消失的数字

轮转数组 思路一 创建一个新内存空间&#xff0c;将需轮转的数依次放入&#xff0c;之后在把其它数放入 代码&#xff1a; void rotate(int* nums, int numsSize, int k) {k k % numsSize;// 确定有效的旋转次数if(k 0)return;int* newnums (int*)malloc(sizeof(int) * nu…

2024数据分析管理、数字经济与教育国际学术会议(ICDAMDEE2024)

2024数据分析管理、数字经济与教育国际学术会议(ICDAMDEE2024) 会议简介 2024年数据分析管理、数字经济和教育国际学术会议&#xff08;ICDAMDEE 2024&#xff09;将在武汉举行。会议不仅展示了来自世界各地的研究专家围绕数据分析管理、数字经济和教育的最新科研成果&#xf…

纯血鸿蒙APP实战开发——Grid和List内拖拽交换子组件位置

Grid和List内拖拽交换子组件位置 介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子…

【项目实战】使用Yolov8 + tesseract 实现身份证信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于实验,毕业设计参考等。整体效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录 一 数据集制作

Omnity 进展月报 | 2024.4.1-4.30

Omnity 大事摘要 1、Octopus 官宣升级为 Omnity。 2、Omnity 4月28号正式上线&#xff0c;实现BTC 和 ICP 之间跨链转账 Runes 资产。 3、为庆祝上线&#xff0c;以符文 HOPE•YOU•GET•RICH 为资产&#xff0c;发红包快速触达大量用户&#xff0c;体验跨链服务。 4、Omni…

你知道C++多少——默认成员函数

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

Vulstack红队评估(一)

文章目录 一、环境搭建1、网络拓扑2、web服务器(win7)配置3、域控&#xff08;winserver2008&#xff09;配置4、域内机器&#xff08;windows 2003&#xff09;配置5、调试网络是否通常 二、web渗透1、信息搜集2、端口扫描3、目录扫描4、弱口令5、phpmyadmin getshell日志gets…

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候&#xff0c;装在SD卡的apk和装在系统盘的apk扫描过程不一样&#xff0c;系统盘apk在系统启动过程中扫描&#xff0c;而SD卡上的就不是&#xff0c;等系统启动好了才挂载、扫描&#xff0c;下面就说下SD扫描的流程&#xff1a; 在SystemServer启动MountService&am…

ARM架构安全特性之防御执行技术

安全之安全(security)博客目录导读 目录 1、侧信道攻击威胁 2、推测屏障Speculation Barriers 3、栈溢出攻击威胁 4、指针认证PAC 5、分支目标识别BTI 6、内存安全违规威胁 7、内存标记扩展MTE 8、加强数据保护 9、特权不可访问&#xff08;Privileged Access Never …

[图解]SysML和EA建模住宅安全系统-01

1 00:00:00,980 --> 00:00:03,100 接下来&#xff0c;我们来看一下案例 2 00:00:04,930 --> 00:00:06,750 我们这次课程的案例 3 00:00:07,090 --> 00:00:13,800 选用了SysML实用指南的书上 4 00:00:13,810 --> 00:00:16,180 第十七章这个案例 5 00:00:16,350 …

sqlite3命令行工具无法退出问题处理

一、背景&#xff1a; 软件使用的后台数据库为sqlite&#xff0c;linux主机系统层面使用sqlite3命令行工具登录数据库后&#xff0c;无法执行sql脚本&#xff0c;无法退出sqlite3。无法执行ctrlc&#xff0c;执行ctrlz后sqlite3前台进程被中断&#xff0c;但是该进程没有退出。…

每日OJ题_贪心算法四⑤_力扣354. 俄罗斯套娃信封问题

目录 力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xff09; 解析代码2_重写排序贪心二分 力扣354. 俄罗斯套娃信封问题 354. 俄罗斯套娃信封问题 难度 困难 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

2024数维杯数学建模B题生物质和煤共热解问题的研究原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024数维杯数学建模挑战赛B题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024数维杯数学建模B题煤共热解每一问高质量完整代码讲解&#xff01;_哔哩哔哩_bilibili 2024数维杯…