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

  • 办税员可以购票吗?
  • 餐饮企业购入的啤酒不拿消费税吗
  • 税控盘注意事项
  • 什么情况下需要补牙
  • 垫付运费的运费税怎么做分录
  • 小企业汇算清缴所得税会计分录
  • 个人独资企业有章程没有
  • 一般纳税人所得税优惠政策最新2022
  • 每天现金日记账登记完以后应怎么对账
  • 公司报销费用发票怎么开
  • 递延收益涉税
  • 法人转钱进公账要交税吗
  • 月末应付职工薪酬计算方法
  • 营改增的会计处理及其对财务的影响
  • 培训费没有发票怎么办
  • 期末余额全部转出的有哪些
  • 因质量出问题的事件
  • 社保基数与个税缴纳基数一致
  • 地税开发票为啥要交百分之二的企业所得税?
  • 在途物资的入账价值
  • 企业出售固定资产取得的净收益应列入的利润表项目是
  • 对方开具红字发票过来怎么做进项税转出
  • 当月计提当月缴纳的增值税还用结转吗
  • 运输发票车种车号要求 自有车
  • 手机超过1万元有必要买吗
  • 三险一金专项扣除怎么查
  • 工程公司更换单位怎么办
  • php laravel教程
  • 消费税有减免政策吗
  • 铁路货物运输代理
  • 怎么绕开中介找到房主
  • 工业企业成本核算流程
  • 契税发票遗失怎么处理
  • Aerial view of Chapel Bridge over the river Reuss in Lucerne, Switzerland (© Neleman Initiative/Gallery Stock)
  • vue vif
  • 【深度学习】模型过拟合的原因以及解决办法
  • lftp shell
  • 办公费用会计科目怎么写
  • 生产加工型企业需要办理哪些证件
  • 其他机械和设备修理业包括哪些
  • 非流动资产处置计入什么科目
  • 预付账款和挂账的区别
  • 增值税电子普通发票和专票的区别
  • myeclipse配置数据库连接
  • 进项税额红字
  • 控股合并的账务处理
  • 出口企业消费税怎么算
  • sql server数据库中的null(空值)
  • 对于产品开发阶段的评价
  • 出售抵债资产账务处理
  • 注册资本金印花税什么时候缴纳
  • 微信转账没有显示对方的名字怎么办
  • 结转存货跌价准备是什么意思
  • 关于外贸企业出口的规定
  • 影响折旧的因素有哪三个方面
  • 销售如果对待不同客户
  • 去年的进项发票今年怎么入账
  • win7隐藏共享文件夹
  • windows vista怎么样
  • windows2000怎么安装
  • win8系统无法开机如何备份数据
  • w10 office激活
  • Win10中SmartScreen无法设置需要系统管理员身份该怎么办?
  • linux命名命令
  • win8.1不能关机
  • 在linux系统中创建文件的命令
  • 下载的mt4安装成了mt5
  • nodejs 用途
  • javascript新手教程
  • js获取tbody
  • 如何批量删除列表
  • vue组件精讲
  • 安卓app开源项目
  • JavaScript电子时钟倒计时
  • prototype模型
  • js设置点击效果
  • 国家税务局2017年11号
  • 张家港市有什么好吃的美食
  • 广州市国税咨询电话
  • 保税区社会车辆能进吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设