并发-守护线程setDaemon()

news2024/11/29 4:36:08

目录

为什么存在

什么是守护线程

创建守护线程

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

可以使用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.coloradmin.cn/o/1668213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解C++中的Vector容器:用容器构建高效程序

文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现&#xff0c;C的这个部分内容就是众所周知的STL&#xff08;标准模版库&#xff09;&a…

别人家的UI表单为什么这么漂亮?而你却千篇一律。

设计漂亮的移动UI页面表单页需要考虑以下几个方面&#xff1a; 布局和结构设计 合适的布局和结构&#xff0c;使表单页面看起来整洁、清晰&#xff0c;并且易于使用。可以使用网格系统或者栅格布局来对表单进行划分&#xff0c;使不同的表单元素有明确的位置和排列。 色彩和配…

java线程局部变量使用方式

线程局部变量是Java中用于存储线程本地信息的变量。这种变量仅在线程的生命周期内存在&#xff0c;并且每个线程都有自己的一份拷贝。换句话说&#xff0c;线程局部变量是线程私有的&#xff0c;其他线程无法访问。 使用场景主要包括&#xff1a; 1. 存储线程状态信息&#xff…

Tableau-BI仪表盘搭建

目录 经营数据总览 经营数据详情 每日营收数据 每日流量数据 新老客占比 平台占比 门店占比 投放情况 订单分布 配送分布 汇总搭建仪表板 构思仪表盘布局 经营数据总览 数据总览表&#xff0c;显示的是数据&#xff0c;就拖入文本中&#xff0c;其他同样加入到已经…

HNU-操作系统OS-2024期中考试

前言 该卷为22计科/智能OS期中考卷。 感谢智能22毕宿同学记忆了考卷考题。 同学评价&#xff1a;总体简单&#xff1b;第1&#xff0c;7概念题较难需要看书&#xff1b;第4&#xff0c;5题原题。 欢迎同学分享答案。 【1】共10分 操作系统的设计目标有哪些&#xff1f; 【…

【C++】继承(菱形继承的深入理解)

在本篇博客中&#xff0c;作者将会带领你深入的理解C中的继承。 注意&#xff01;&#xff01;&#xff01;本篇博客是在32位机器下进行讲解的&#xff0c;64位下会有所不同&#xff0c;但大同小异。 一. 继承的概念及定义 继承的概念 什么是继承&#xff1f;为什么要有继承&…

pixhawk无人机飞控解锁

飞控解锁 GitBook 左手油门的遥控解锁是油门右下角拨&#xff0c;右手油门是油门最低&#xff0c;方向最右。 飞控如何加锁? 左手油门&#xff1a;油门左下角 右手油门&#xff1a;油门最低&#xff0c;方向最左 飞控解锁成功后&#xff0c;不推油门的情况下&#xff0c;…

ssm121开放式教学评价管理系统+vue

开放式教学评价管理系统vue 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对开放式教学评价管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了开放式开放…

上位机图像处理和嵌入式模块部署(树莓派4b的软件源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多文章都建议替换一下树莓派4b的软件源&#xff0c;不过我自己实际使用下来&#xff0c;官方的软件下载速度其实还可以。这里下载的时候&#xf…

部署Gerapy

1.Gerapy 是什么&#xff1f; Gerapy 是一款基于 Python 3 的分布式爬虫管理框架&#xff0c;它旨在简化和优化分布式爬虫的部署、管理和监控过程。 2.作用与功能&#xff1f; 2.1分布式管理&#xff1a; Gerapy 允许用户在多台机器上部署和管理Scrapy爬虫&#xff0c;实现爬虫…

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…

生成器与迭代器

生成器 生成器的概念 在python中&#xff0c;一边循环一边计算的机制叫做生成器&#xff0c;我们设想一个场景&#xff1a;如果我要列举一万个数字&#xff0c;我可以先创建一万的数存入列表中或者挖掘这一万个数之间的规律然后通过一边计算一边循环来一个一个得到这一万个数。…

springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

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

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

Linux 信号保存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 阻塞信号 1. 信号其他相关常见…

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站&#xff0c;包括外贸企业网站、个人博客网站、中小企业官网等&#xff0c;那么作为新手不知道哪家香港虚拟主机好用的时候&#xff0c;该如何找到可以试用的香港虚拟主机呢&#xff1f; 香港虚拟主机也称作香港空间、香港虚拟空间&#xff0c;…

基于截断傅里叶级数展开的抖动波形生成

1、背景 抖动是影响信号完整性的重要因素。随着信号速率的不断提高&#xff0c;抖动的影响日益显著。仿真生成抖动时钟或抖动信号&#xff0c;对系统极限性能验证具有重要意义。抖动是定义在时域上的概念&#xff0c;它表征真实跳变位置(如跳边沿或过零点)与理想跳变位…

18 搜索语法+AI工具找到你想要的答案

1 常用到的AI 官网地址 Perplexity AI: 一个聊天机器人式的搜索引擎&#xff0c;使用生成式AI技术提供答案。 官网地址: Perplexity AI3 Lepton Search: 开源的对话式AI搜索引擎。 官网地址: Lepton Search5 ThinkAny: 由独立开发者idoubi开发的AI搜索引擎&#xff0c;使用RAG技…

安卓开发--新建工程,新建虚拟手机,按键事件响应(含:Android中使用switch-case遇到case R.id.xxx报错)

安卓开发--新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应 1.前言2.运行一个工程2.1布局一个Button2.2 button一般点击事件2.2 button属性点击事件2.2 button推荐点击事件&#xff08;含&#xff1a;Android中使用switch-case遇到case R.id.xxx报错&#xff09; 本…