守护线程(Daemon Threads)详解:与非守护线程的区别

守护线程(Daemon Threads)详解:与非守护线程的区别

    • 1、守护线程是什么?
    • 2、守护线程与非守护线程的区别
      • 2.1 JVM关闭行为
      • 2.2 任务性质
      • 2.3 线程设置
      • 2.4 示例代码
    • 3、总结


💖The Begin💖点点关注,收藏不迷路💖

线程被明确区分为守护线程(Daemon Threads)和非守护线程(User Threads 或 Non-Daemon Threads)。它们在JVM中的行为,特别是在JVM关闭时的表现上,存在显著差异。

1、守护线程是什么?

守护线程是一种特殊类型的线程,它们服务于用户线程(非守护线程)。主要特点是:当JVM中没有任何非守护线程运行时,JVM将直接退出,而不会等待守护线程完成其执行。这种设计使得守护线程成为执行如垃圾收集(GC)、JVM内部监控等后台任务的理想选择。

2、守护线程与非守护线程的区别

2.1 JVM关闭行为

  • 非守护线程:当所有非守护线程都终止时,JVM才会退出。若存在非守护线程仍在运行,JVM将等待它们完成。
  • 守护线程:JVM不会等待守护线程完成。只要没有非守护线程在运行,JVM将立即退出。

2.2 任务性质

  • 非守护线程:通常用于执行需要结果或完成某些关键任务的代码,如处理用户请求、执行计算任务等。
  • 守护线程:专注于执行后台任务,这些任务在JVM退出前无需完成,如垃圾收集、线程状态监控等。

2.3 线程设置

  • 在Java中,通过调用线程对象的setDaemon(true)方法,可以将线程设置为守护线程。但这一调用必须在线程启动之前完成。
  • 默认情况下,新创建的线程都是非守护线程。

2.4 示例代码

下面是一个简单的示例,展示了如何创建守护线程和非守护线程,并观察它们在JVM关闭时的行为差异。

public class DaemonThreadExample {  public static void main(String[] args) {  // 创建并启动非守护线程  Thread nonDaemonThread = new Thread(() -> {  for (int i = 0; i < 5; i++) {  System.out.println("非守护线程运行中: " + i);  try {  Thread.sleep(1000);  } catch (InterruptedException e) {  e.printStackTrace();  }  }  });  nonDaemonThread.start();  // 创建并启动守护线程  Thread daemonThread = new Thread(() -> {  for (int i = 0; i < 10; i++) {  System.out.println("守护线程运行中: " + i);  try {  Thread.sleep(1000);  } catch (InterruptedException e) {  e.printStackTrace();  }  }  });  daemonThread.setDaemon(true); // 设置为守护线程  daemonThread.start();  // 主线程(非守护线程)结束,但非守护线程仍在运行  // 由于主线程是非守护线程,JVM会等待它完成  // 但由于我们没有显式等待非守护线程,它会很快结束  // 实际上,在这个例子中,我们看不到守护线程完成所有迭代,因为JVM会很快退出  }  
}

3、总结

它们的主要区别在于JVM关闭时的行为:

1、非守护线程:JVM会等待所有非守护线程完成后才关闭。这些线程通常用于执行关键任务,如用户请求处理。

2、守护线程:JVM关闭时不会等待守护线程完成。守护线程常用于执行后台任务,如垃圾收集,其执行不需要在JVM退出前完成。

创建守护线程很简单,只需在线程启动前调用setDaemon(true)方法。默认情况下,新创建的线程都是非守护线程。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

pytorch 绘制Depth Anything网络结构

pytorch 绘制模型的网络结构有很多中方法&#xff0c;个人比较喜欢 torchview 生成的 Graphviz 风格的图片。 Graphviz介绍 Graphviz是一款开源的图形可视化软件&#xff0c;其名称来源于“Graph Visualization Software”的缩写。它通过使用一种名为DOT的描述语言来定义图形…

不踩雷的护眼大路灯有哪些?五款盲选不踩雷的护眼大路灯推荐

不踩雷的护眼大路灯有哪些&#xff1f;作为一名专业的实测博主温馨提示大家&#xff0c;虽然护眼落地灯是个好东西&#xff0c;它能够提供柔和舒适的环境光&#xff0c;减少对眼睛的伤害&#xff0c;但是千万别乱买跟风&#xff0c;盲目入手踩雷率80%以上。那么如何辨别一盏护眼…

创客项目秀 | 基于 XIAO 开发板的语音向导

背景 柴火创客空间作为大湾区科技创新的窗口&#xff0c;每年到访空间的社区伙伴众多&#xff0c;为了更好的进行空间信息交互&#xff0c;我们希望有一个装置是可以解决&#xff1a;当空间管理员不在现场的时候&#xff0c;到访者可以通过装置获得清晰的介绍与引导。 为了解…

vue2 封装插槽组件

安装 element-ui npm install element-ui --save ---force main.js 导入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue; Vue.use(ElementUI); new Vue({ el: #app, render: h > h(Ap…

全渠道AI数字化商品管理 零售品牌增长“超级引擎”

随着“流量红利”时代的终结 品牌面临增速放缓、利润下滑的双重挑战。 消费者的诉求日益理性和个性化&#xff0c; 国内外品牌角逐市场份额 A1、大数据等先进技术迅猛发展 品牌商品计划管理变得更加复杂而多维。 零售品牌正加速数字化与全渠道融合以应对挑战。 可持续盈利…

对于一家企业来说,电气数字化是否有那么重要?

时代大背景下&#xff0c;尤其是在复杂的国际与社会环境交织之中&#xff0c;全社会的“数字化”转型已成必然之势。对于电子产业而言&#xff0c;“数字化”无疑是重大机遇。 众所周知&#xff0c;在蒸汽机时代&#xff0c;身为机械工程师堪称幸运&#xff0c;彼时涌现出众多…

MySQL 将查询结果导出到文件(select … into Statement)

我们经常会遇到需要将SQL查询结果导出到文件&#xff0c;以便后续的传输或数据分析的场景。为了满足这个需求&#xff0c;MySQL的select语句提供了into子句可以将的查询结果直接导出到文本文件。本文就MySQL中select…into的用法进行演示。 文章目录 一、select…into语句简介…

AWS账号注册:AWS 用借记卡注册是否有风险?

亚马逊云服务&#xff08;Amazon Web Services&#xff0c;简称 AWS&#xff09;作为全球领先的云服务提供商&#xff0c;吸引了众多企业和个人用户。注册 AWS 账户时&#xff0c;提供支付方式是必要的步骤&#xff0c;许多用户会选择使用借记卡来完成注册。那么&#xff0c;使…

idea、webstorm、navicat等2024大佬总结亲测可用

宝藏网址&#xff0c;亲测可用。 关于JetBrains全家桶激活。 扫码关注&#xff1a;JAVA和人工智能。回复 idea 或 webStorm 或 navicat 获取 仅学习使用&#xff0c;不要用于商业用途&#xff01;

【剑指offer】

剑指offer 面试题67&#xff1a;字符串转成整数面试题1&#xff1a;赋值运算符函数面试题3&#xff1a;数组中重复的数字 面试题67&#xff1a;字符串转成整数 LeedCode&#xff1a;LCR 192. 把字符串转换成整数 (atoi) 测试atoi的功能和异常效果 #include <iostream> #…

二叉树的介绍及其顺序结构的实现

Hello, 亲爱的小伙伴们&#xff0c;你们的作者菌又回来了&#xff0c;之前我们学习了链表、顺序表、栈等常见的数据结构&#xff0c;今天我们将紧跟之前的脚步&#xff0c;继续学习二叉树。 好&#xff0c;咱们废话不多说&#xff0c;开始我们今天的正题。 1.树 1.1树的概念和…

vue3框架Arco Design输入邮箱选择后缀

使用&#xff1a; <a-form-item field"apply_user_email" label"邮箱&#xff1a;" ><email v-model"apply_user_email" class"inputborder topinputw"></email> </a-form-item>import email from /componen…

Java语言程序设计基础篇_编程练习题***15.35/15.34 (动画:自回避随机漫步)

***15.34 (模拟&#xff1a;自回避随机漫步) 在一个网格中的自回避漫步是指从一个点到另一点的过程中&#xff0c;不重复两次访问一个点。自回避漫步已经广泛应用在物理、化学和数学学科中。它们可以用来模拟像溶剂和聚合物这样的链状物。编写一个程序&#xff0c;显示一个从中…

Educational Codeforces Round 168 (Rated for Div. 2)

据说这场比赛非常简单&#xff0c;但本蒟蒻却认为比以往还要难(;༎ຶД༎ຶ) A.Strong Password 输入样例&#xff1a; 4 a aaa abb password输出样例&#xff1a; wa aada abcb pastsword思路&#xff1a; 我们只需在原来字符串中连续的两个字符之间插入一个不同的字符&…

React 学习——自定义Hook实现,使用规则

使用规则&#xff1a; 只能在组件中或者其他自定义Hook函数中调用只能在组件的顶层调用&#xff0c;不能嵌套在 if、for、其他函数中 import { useState } from "react"// 封装函数 function useToggle(){const [show,setShow] useState(true);const toggle ()&…

机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 作者&#xff1a;王恩策、徐庆 火山引擎 LAS 团队 火山引擎数智平台 VeDI 是火山引擎推出的新一代企业数据智能平台&#xff0c;基于字节跳动数据平台多年的“数据…

迪文屏使用记录

项目中要使用到迪文屏&#xff0c;奈何该屏资料太琐碎&#xff0c;找的人头皮发麻&#xff0c;遂进行相关整理。 屏幕&#xff1a;2.4寸电容屏 型号&#xff1a;DWG32240C024_03WTC 软件&#xff1a;DGUS_V7.647 1.竖屏横显 打开软件左下方的配置文件生成工具&#…

前端如何实现更换项目主题色的功能?

1、场景 有一个换主题色的功能&#xff0c;如下图&#xff1a; 切换颜色后&#xff0c;将对页面所有部分的色值进行重新设置&#xff0c;符合最新的主题色。 2、实现思路 因为色值比较灵活&#xff0c;可以任意选取&#xff0c;所以最好的实现方式是&#xff0c;根据设置的…

解读权限信息

1. 权限信息 在查看工作目录的内容时&#xff0c;经常看到如下格式的信息&#xff1a; 第一列&#xff1a;文件/文件夹的权限&#xff08;或者叫权限控制信息&#xff09;&#xff1b; 第二列&#xff1a;文件/文件夹的所属用户&#xff1b; 第三列&#xff1a;文件/文件夹…