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

  • 2023小规模免税收入会计分录怎么写啊
  • 研发销售型企业
  • 支付境外劳务费需要缴纳哪些税费
  • 实物折扣的增值税
  • 借款入账会计分录
  • 跨年取得的发票怎么入账
  • 手工现金日记账怎么转下一页
  • 人工费用的核算例题
  • 职工福利费允许结转以后年度扣除吗
  • 增值税扣费
  • 个体每月开票超10万
  • 社保基数3125交多少钱
  • 营改增后企业所得税怎么算
  • 账务处理和税前扣除如何处理
  • 个人劳务发票怎么交税
  • 服务费增值税专用发票税点
  • 资产减值准备的会计科目
  • 保证金算费用吗
  • 增值税的价外费用不包括什么
  • 小规模纳税季度申报
  • 发票一直显示在报送中
  • 房产税要来了!租金也要交,最高达到12%
  • 营改增后一般纳税人动产租赁税率
  • 预收账款属于金融资产吗为什么
  • 小规模纳税人跨月冲红退税
  • 机票进项税额怎么申报
  • 委托加工物资合并报表
  • 财务计提个人缴纳社保部分怎么记账?
  • 出口退税免退税办法
  • windows10如何开机启动软件
  • Windows自带的截图
  • 净资产收益率公式推导
  • 车辆购置税为什么查不到发票信息
  • nginx不支持ipv6
  • php 递归函数
  • 在建工程完工后转入哪里
  • 收到对方公司开出发票如何做账
  • php

  • web前端基本知识
  • 奥林匹克国家公园
  • php获取文件内容
  • vue 动态添加路由
  • php用img显示图片
  • thinkphp pathinfo
  • uni-app原理
  • java 读写锁 map
  • 财务软件费用可以抵税吗
  • 过渡期怎么坚持下去
  • 法定盈余公积的作用
  • sql server 2005数据库备份
  • 福利费入账需要发票吗
  • 买车险怎么打折
  • 企业做税务局迁移应该做哪些事情
  • 竣工结算的审核要点
  • 计算结转本月未交增值税
  • 客户购买商品的三要素
  • 关于消费税的会计处理
  • 研发费用计入营业成本还能加计扣除吗
  • 建筑劳务没有合同能起诉吗
  • ubuntu系统安装无线网卡驱动
  • mysql5.7.29安装
  • 被遗忘的战役
  • 设置和使用电子技术监控设备收集信息
  • linux进程运行的两种方式
  • win8笔记本无线连接没有了,怎么设置
  • win 7关闭睡眠
  • opengl clamp
  • js修改css样式属性不生效
  • jquery 插件写法
  • bat xcopy copy
  • android遇到的难题,怎么解决的
  • javascript $符号
  • Python3使用requests包抓取并保存网页源码的方法
  • python批量修改文本内容
  • jquery的底层原理
  • jquery实例
  • jquery将文本框设置为只读
  • 从局部变量和全变量区分
  • 广东省电子税务局登录方式
  • 上市公司季报有哪些内容
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设