位置: IT常识 - 正文

Java守护线程(java守护线程和本地线程区别)

编辑:rootadmin
Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。 守护线程是所有非守护线程的保姆,当所有非守护线程执行完成或退出了,即使还有守护线程在运行,JVM也会直接退出,因此守护线程通常是用来处理一些辅助工作。 反之,对于非守护线程,只要有一个在运行,JVM就不会退出。 典型的守 ...

Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。

守护线程是所有非守护线程的保姆,当所有非守护线程执行完成或退出了,即使还有守护线程在运行,JVM也会直接退出,因此守护线程通常是用来处理一些辅助工作。

反之,对于非守护线程,只要有一个在运行,JVM就不会退出。

典型的守护线程如垃圾回收GC线程,当用户线程都结束后,GC也就没有单独存在的必要,JVM直接退出。

我们可以通过Thread对象的setDaemon(boolean on)方法设置是否为守护线程,要在start之前设置:

Thread thread = new Thread(runnable);thread.setDaemon(true); // true表示守护线程,false表示用户线程thread.start();

需要注意的是,如果没有显示调用setDaemon方法进行设置,线程的模式是取决于父线程是否为守护线程,也就是创建此线程所在的线程。

如果父线程是守护线程,创建的线程默认是守护线程;

如果父线程是用户线程,创建的线程默认是用户线程。

这可以从Thread类的init方法源代码中看出:

Thread parent = currentThread();this.daemon = parent.isDaemon();

对于daemon的设置,保存在了Thread对象的成员变量中,Thread提供了setter/getter:

private boolean daemon = false;//是否为守护线程public final void setDaemon(boolean on) {//SecurityManager安全检查,本文不展开讨论checkAccess();//检查线程是否已启动,已启动无法设置daemonif (isAlive()) {throw new IllegalThreadStateException();}daemon = on;}public final boolean isDaemon() {return daemon;}

setDaemon方法中通过isAlive判断线程是否已启动,已启动状态下不允许修改,抛出IllegalThreadStateException异常。

接着我们用示例来验证一下守护线程和非守护线程的区别。

以下是守护线程示例:

Thread t = new Thread(() -> {System.out.println("before");ThreadUtil.sleep(5000);System.out.println("after");});//显式设置daemon为truet.setDaemon(true);t.start();ThreadUtil.sleep(1000);System.out.println("exit");

输出:

beforeexit

可以发现,当线程设置为守护线程后,主线程一旦执行完毕,程序退出,守护线程也随着立即终止。

以下是非守护线程示例:

Thread t = new Thread(() -> {System.out.println("before");ThreadUtil.sleep(5000);System.out.println("after");});//显式设置daemon为falset.setDaemon(false);t.start();ThreadUtil.sleep(1000);System.out.println("exit");

输出:

beforeexitafter

虽然主线程已经执行完毕,但创建的非守护线程还在运行。

具体JVM是如何通过daemon字段控制线程的,这在JDK中找不到相应源码,需要深入hotspot C++源码进行分析,后续有必要再追加更新。

本文链接地址:https://www.jiuchutong.com/zhishi/310482.html 转载请保留说明!

上一篇:织梦dedecms首页列表页获取文章带链接tag标签(织梦官方网站)

下一篇:帝国cms如何解决截图出现黑边的问题(帝国cms使用手册)

  • 金税三期登录界面
  • 股权转让需要缴纳企业所得税吗
  • 利润表的税金及附加是计提数还是实缴数
  • 出口报关单运费小于实际运费
  • 一般纳税人公司转让一般卖多少钱
  • 无形资产的出售的会计处理
  • 资产负债表上预付账款和预收账款区别
  • 土地增值税预征率
  • 共同控制合营企业
  • 收到国家退税
  • 投资款多投了怎么办
  • 企业分立房产税税收政策
  • 固定资产月底怎么处理
  • 个人独资企业是法人吗
  • 四季度企业所得税怎么报
  • 如何关闭windowsdefender防病毒
  • 听证方式有几种
  • php?ms=0&qgg=&_wv=3
  • 商场充值卡发票在哪开
  • 双系统启动界面
  • 你知道约定的公司有哪些
  • PHP:Memcached::prependByKey()的用法_Memcached类
  • springboot+vue+elementsUI 实现分角色注册登录界面
  • php中的类型提示是什么
  • 财务如何核对会计信息
  • 公司代扣税
  • 企业支付给员工的一次性伤残就业补助金计入什么科目
  • 跨年调整收入增值税怎么办
  • vue自定义弹窗带有遮罩层
  • vue2:elementUI中Form 表单在特定情况下做动态rules添加删除
  • php -r
  • php去除字符串中的引号
  • html 提交表单
  • ChatGPT可以做什么
  • 去年的所得税计提多了怎么做分录
  • 财政拨付资金什么意思
  • 印花税和工会经费用不用计提
  • 中药饮片盘点误差范围
  • 工伤补贴如何做帐
  • 工资表中可以出现减号的情况吗
  • 原材料退库的会计分录
  • 帝国cms首页调用其他网站数据
  • 购买一台电脑2400元贵吗
  • 施工企业预缴税款
  • 受让应收账款的账务处理
  • 累计摊销咋算
  • 红冲去年暂估的费用怎么做账
  • 企业每月营业额达多少需要交税
  • 特殊销售方式下销售额的确定
  • 企业大股东减持股权
  • 延缓缴纳的企业所得税怎么做账
  • 进项抵扣后的附加税
  • 有形资产的例子
  • 开出去的发票
  • 运输费增值税专用发票
  • 工程公司存货包括哪些科目
  • 企业会计准则和小企业准则的区别
  • 如何理解股权激励
  • SQL Server中通配符的使用示例
  • sql查询生成器
  • 用注册表关闭更新
  • 给推荐几款
  • windows7包含6个版本其中什么最强大支持的功能最多
  • Win7 64位摄像头驱动显示黄色感叹号无法使用的解决方法
  • win7系统宽带连接651
  • 新手学做ppt
  • jquery的事件处理
  • Node.js + Redis Sorted Set实现任务队列
  • android游戏开发论文
  • node 开发
  • android开发教程视频
  • unity脚本调用
  • javascript基础书
  • dom基础知识
  • 云南新农合网上怎么交
  • 政府补贴 收入
  • 国有企业租赁经营 河北省
  • 个体户增值税申报比对不符怎么处理
  • 监理费合同按什么计算
  • 内蒙古总工会工会经费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设