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

  • 土地增值税常见问题及解答
  • 劳务费增值税专用发票税率是多少
  • 企业购入免税农产品
  • 利息收入纳税义务时点
  • 交易性金融资产是什么意思
  • 个体工商户需要交税吗?怎么交?
  • 应交税费贷方发生额表示什么金额
  • 制造业的税率是多少啊
  • 开发票高校是企业还是非企业单位
  • 物业费专用发票税率
  • 水泥销售成本怎么算
  • 商铺出租怎么做账
  • 增值税发票抵扣多少个点
  • 商品流通企业商品流转的核算方法有
  • 个人互换住房土地增值税
  • 政府补贴转给其他公司
  • 增值税普通发票可以抵扣吗
  • 工资哪些扣款应该扣税
  • 企业的福利费如何使用
  • 土地使用税级别划分标准
  • 业务招待费中的营业收入包括哪些
  • 残联备案还能补缴社保吗
  • 车票进项税可以跨年抵扣吗
  • 会议费 报销
  • 收到有误的增值税专用发票的怎么处理
  • 持有至到期投资是什么意思
  • 如何使用ping命令诊断网络故障
  • 旅游服务业账务处理办法
  • 发现以前年度多交增值税怎么申报
  • 公司开业需要怎么布置
  • 销售货物货款未收的会计分录
  • an exit
  • 前端生成pdf文件
  • php单例模式demo
  • 公司其他费用包括哪些费用
  • 广角镜头下的人
  • 利润分配弥补亏损会计分录
  • 减值准备递延所得税资产
  • node.js安装步骤
  • 会计月末账务处理程序
  • css的transition滑动效果
  • 代理付银行手续费合法吗
  • 材料可变现净值为什么不减去材料的销售费用
  • 发票上的抵扣联抵扣联是什么意思
  • 企业所得税免税项目
  • 收取子公司管理费用
  • 纳税申报怎么做
  • 费用科目入错了
  • 外聘人员个人简历
  • 离岸服务外包收入
  • 机票行程单改签费抵扣 税务局
  • 消耗性生物资产属于非流动资产吗
  • 两套账的会计被判刑吗
  • mysqli查询
  • win10系统电脑如何共享
  • freebsd使用
  • win7 64位系统安装绘声绘影8提示已安装另一个版本的解决方法
  • macappstore下载不了软件
  • centos7搜索
  • svcinit.exe - svcinit是什么进程
  • linux7.2 sudo权限配置
  • ssh远程登录设置
  • Win10预览版拆弹
  • dns轮询是什么意思
  • 如何打开win7
  • windows预览0x80072ee2
  • dos强制删除文件命令
  • javascript数组去重代码
  • jquery自定义组件
  • jquery设置滚动条
  • Android - Designtime Layout Attributes & Tools Attributes
  • android 字体设置
  • [置顶]马粥街残酷史
  • python编程快速
  • python开发环境有
  • Material Design:利用RecyclerView CardView实现新闻卡片样式
  • 安卓手机加速方法
  • 云南省税务申报流程
  • 定额发票作废了还能报销吗
  • 办图书馆怎么审批
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设