并发-守护线程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. 什么是空间预分配以及惰性空间释放…

Vue3实战笔记(16)—pinia基本用法--Getter

文章目录 前言一、pinia的getter简单理解二、访问其他 store 的 getter总结 前言 在 Pinia 中&#xff0c;getter 类似于 Vuex 中的 getter&#xff0c;允许你从 store 中派生出一些状态&#xff0c;而不需要修改原始状态。这使得我们可以创建基于现有状态的计算属性。 一、pi…

练习题(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…

树莓派C语言开发

安装C语言编译器和开发工具 sudo apt update sudo apt install build-essential 此命令会安装GCC编译器以及make等其他工具&#xff0c;这些都是C语言程序开发过程中必需的。 配置文本编辑器 树莓派默认安装了几个文本编辑器&#xff0c;如Nano和Vim。如果你对这些编辑器不熟…

如何远程访问?

远程访问是指在不同的地理位置之间通过网络连接来实现对目标设备或系统的访问。无论是在个人生活还是商业领域&#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;完全由电能来实现…

【LeetCode】数组——hashmap的妙用

在遇到一类题目时&#xff0c;通过双for循环也可暴力破解&#xff0c;但我们可以通过用hashmap来代替一次for循环节约时间开支&#xff0c;在算法上属于用空间换时间&#xff0c;也能帮助我们更好的理解hashmap这一种重要数据结构&#xff0c;并熟悉hashmap的重要方法。 1.两数…

31Windows精简系统下载推荐

Windows精简系统下载推荐 世界上有很多人在做Windows精简系统&#xff0c;去掉了他们认为不必要的功能和插件&#xff0c;达到了减小系统安装包体积&#xff0c;提升系统运行流畅度和稳定性的目的。 笔者推荐使用大佬不忘初心制作的精简版系统&#xff0c;最精简windows10系统安…

什么是数据平台——企业构建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;但它们在深度学习社区中的应用和受欢迎…

linux程序分析命令(一)

linux程序分析命令(一) **ldd&#xff1a;**用于打印共享库依赖。这个命令会显示出一个可执行文件所依赖的所有共享库&#xff08;动态链接库&#xff09;&#xff0c;这对于解决运行时库依赖问题非常有用。**nm&#xff1a;**用于列出对象文件的符号表。这个命令可以显示出定…

什么事防抖和节流,有什么区别,如何实现

防抖和节流&#xff0c;本质上是优化高频率执行代码的一种手段&#xff0c;比如&#xff1a;resize、scroll、keypress、mousemove这些事件在触发的时候&#xff0c;会不断调用绑定在事件上的回调函数&#xff0c;这样极大浪费资源&#xff0c;降低前端性能。 为了优化体验&am…

ipa 分区算法分析,图解

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

函数原型(Function Prototype)、函数定义(Function Definition)和函数声明(Function Declaration)

函数原型&#xff08;Function Prototype&#xff09;、函数定义&#xff08;Function Definition&#xff09;和函数声明&#xff08;Function Declaration&#xff09;在C和C等编程语言中扮演着不同的角色&#xff0c;但它们有时在概念上可能会有些重叠。下面是它们之间的主要…

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 <…