并发-守护线程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.mzph.cn/web/10960.shtml

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

相关文章

小红的字符串构造和小红的排列构造

小红的字符串构造 小红希望你构造一个长度为nnn的、仅包含小写字母的字符串&#xff0c;其中恰好有kkk个长度大于1的回文子串。你能帮帮她吗&#xff1f;输入两个整数n,k&#xff0c;用空格隔开。 1≤n≤10^5,0≤k≤n/2.一个字符串。如果有多解输出任意即可。 可以证明&#x…

[Bug]:由于中国防火墙,无法连接 huggingface.co

问题描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

[AIGC] 几道 redis数据结构相关面试题

文章目录 7. 数据类型的实现8. 什么是空间预分配以及惰性空间释放&#xff0c;SDS 是怎么实现的9. 为什么说 SDS 是二进制安全的呢10. 说说 redis 里的对象11. 使用 RedisObject 的好处12. RedisObject 的具体结构是什么 7. 数据类型的实现 8. 什么是空间预分配以及惰性空间释放…

练习题(2024/5/12)

1二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…

如何远程访问?

远程访问是指在不同的地理位置之间通过网络连接来实现对目标设备或系统的访问。无论是在个人生活还是商业领域&#xff0c;远程访问都起到了重要的作用&#xff0c;帮助人们实现高效的工作和便捷的生活。本文将介绍一款名为【天联】的组网产品&#xff0c;它是一款强大的异地组…

Linux与Windows互传文件【笔记】

Linux与Windows互传文件【笔记】 前言前言推荐Linux与Windows互传文件首先确保Windows安装ssh如何传送文件问题 最后 前言 这是陈旧已久的草稿2023-05-10 00:01:24 这个是准备把计组课程华为智能计组的&#xff0c;传输文件。 最后发现&#xff0c;好像没有实现了。 现在202…

汽车线控转向系统介绍

汽车线控转向系统由方向盘总成、转向执行总成和主控制器(ECU)三个主要部分以及自动防故障系统、电源等辅助系统组成。 线控转向系统(Steering-By-Wire)&#xff0c;取消了方向盘和转向车轮之间的机械连接部件&#xff0c;彻底摆脱了机械固件的限制&#xff0c;完全由电能来实现…

什么是数据平台——企业构建Data+AI的基础数据底座需要的决策参考

什么是数据平台 标准的解释是这样的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 数据平台是指将各类数据进行整合、存储、处…

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

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

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB&#xff1a;选择深度学习的首选编程语言 在深度学习领域&#xff0c;编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前&#xff0c;Python和MATLAB都是进行科学计算和数据分析的流行工具&#xff0c;但它们在深度学习社区中的应用和受欢迎…

ipa 分区算法分析,图解

参考 Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查&#xff0c;实现以及评估对比 相关论文 分区算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割 Interactive SLAM using …

NOR FLASH介绍

参考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH简介 XIP技术:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特点和应用举例&#xff1a; NOR Flash&#xff1a; 特点&#xff1a; 支持随机访问&#xff0c;可以直接…

QT作业4

1、思维导图 2、使用定时器完成闹钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

Py深度学习基础|关于Batch Normalization

1. 为什么需要Batch Normalization 通常我们会在输入层进行数据的标准化处理&#xff0c;这是为了让模型学习到更好的特征。同样&#xff0c;在模型的中间层我们也可以进行normalize。在神经网络中, 数据分布对训练会产生影响。 比如我们使用tanh作为激活函数&#xff0c;当输入…

Baidu Comate智能编码助手:AI编程时代提升效率的好帮手

目录 写在前面一、如何安装二、如何使用场景需求体验步骤 三、AI 编程实战指令功能插件功能知识库功能 四、问题建议五、体验总结&#x1f680;写在最后 写在前面 Baidu Comate 是基于文心大模型的 AI编程工具&#xff0c;它结合百度积累多年的编程现场大数据和外部优秀开源数据…

在xAnyLabeling中加载自己训练的yolov8s-obb模型进行半自动化标注

任务思路&#xff1a; 先使用xAnyLabeling标注一部分样本&#xff0c;训练出v1版本的yolov8-obb模型&#xff0c;然后加载yolov8-obb模型到xAnyLabeling中对其余样本进行半自动化标注。节省工作量。 任务流程&#xff1a; 1.准备xAnyLabeling标注工具 下载代码&#xff0c;…

Redis系列-3 Redis缓存问题

1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能&#xff0c;高并发的场景下&#xff0c;连接池很快被耗尽而出现宕机或DOS&#xff0c;无法继续对外提供服务。相对于数据库的硬盘IO&#xff0c;缓存中间件基于内存进行读写&#xff0c;从而具备较大的吞吐量和高并…

数据结构(四)——二叉树和堆(下)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、二叉树链式结构的实现总结 前言 这篇博客我们将来了解普通二叉树的实现和应用&#xff0c;对大家之前分治和递归的理解有所挑战。 一、二叉树链式结构的实现 1.前置说明 在学习二叉…

Java入门——继承和多态(上)

包 包是组织类的一种方式. 使用包的主要目的是保证类的唯一性. 例如, 你在代码中写了一个 Test 类. 然后你的舍友也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过. 导入包中的类 Java 中已经提供了很多现成的类供我们使用. 例如 public cla…

服装店会员管理系统结合小程序商城帮你挖掘出潜在客户

在现代社会&#xff0c;随着科技的不断进步和人们消费习惯的变化&#xff0c;传统的服装店已经不再能够满足消费者的需求。为了更好地服务客户&#xff0c;提升销售业绩&#xff0c;许多服装店开始引入会员管理系统&#xff0c;并结合小程序商城&#xff0c;实现线上线下的无缝…