位置: 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使用手册)

  • 个所得税计算方法
  • 小规模纳税人出售使用过的汽车
  • 采购服务需要缴什么税
  • 分公司独立核算的利弊
  • 虚增成本300万财务人员责任
  • 金税三期会查之前的票吗
  • 应收账款税收风险有哪些
  • 建筑材料专票抵扣
  • 开公司财务流程
  • 盈利能力分析对企业发展的意义
  • 增值税欠缴税会不会影响企业的信用
  • 超市热卖食品
  • 扶持资金属于政府补助吗
  • 开采石头要交什么税
  • 开票的时候确认收入吗
  • 已抵扣发票如何查询开票明细
  • 公司购买房产的税费
  • 小规模纳税人季报是哪几个月
  • 一般纳税人所得税2023年税率
  • 第二季度的利润表报错了,怎么重新报
  • 税控系统服务费怎么抵扣
  • deepin启动延时
  • 企业所得税纳税标准
  • 进口缴纳的关税通过什么核算
  • 跨年度增值税发票作废怎么退税
  • 什么车不用交保险
  • 废料销售成本怎么计算
  • 税务局开出来的发票没问题吧?
  • 公司车辆使用费用平均
  • 跨年度退货的账务处理
  • 前端程序员和后端程序员哪个工资高
  • vue预览word加水印
  • dos命令暂停停10s
  • 个体工商户有固话吗
  • 防洪费属于税金及附加吗
  • 以银行存款交纳欠缴税金
  • 电缆租赁发票开具属于什么项目
  • 申报财务报表利润怎么写
  • union ll
  • mysql乱码产生原因
  • 旅行社的增值税税率
  • 套期保值是什么意思举个例子
  • 单位结余资金该如何处理
  • 哪些情况属于
  • 金税四期有什么变化
  • 小规模公司购买水泥怎么入账
  • 无固定合同有哪些好处
  • 政府给的专款专用的补贴需要交税吗
  • 银行承兑汇票以公允价值计量
  • 预付下个月租金分录
  • 三栏明细账本怎样填写
  • 金蝶旗舰版如何备份账套
  • 投资方持有的能够对被投资单位实施
  • 高新企业研发费用占比
  • 免税发票可以抵扣税收农产品吗
  • 换工作时社保公积金怎么办
  • mysql复制命令
  • xampp3.2.4安装教程与配置
  • win10怎么设置开机自启软件
  • mac steam一直更新
  • linux系统百科
  • centos如何查询ip
  • 在centos上安装pycharm
  • win10系统更新出错怎么办
  • win8怎么固定桌面图标
  • win8.1系统更新
  • JavaScript事件处理的方式(三种)
  • python里模块
  • jquery 鼠标
  • unity 移动端
  • 安卓初始化
  • 安卓全局替换
  • android app测试
  • android电话簿
  • android 全局viewmodel
  • 财政票据和税务票据的法律效力一样吗
  • 广东国家税务局电子税务局官网入口
  • 文化公司税务筹划
  • 仓储物流企业的事故指标
  • 交通运输业包含哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设