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

  • 个人去税务局开专票需要提供什么
  • 两地发工资个税处理
  • 企业被环保关停政府赔偿
  • 小规模纳税人预缴税款怎么填申报表
  • 金税盘技术维护费怎么申报
  • 开票服务费全额抵扣分录
  • 应收账款借方负数的会计分录怎么做
  • 报关单上单位名称写千克还是kg
  • 按月预提短期借款利息
  • 小规模纳税人从哪里可以看出来
  • 开发票税收分类编码怎么选
  • 无偿赠送要交税吗
  • 增值税确认平台一直显示该网站出现问题
  • 无形资产属于什么行业
  • 全年实现利润总额为6035
  • 买东西退税退的是什么税
  • 超市买的东西开什么发票
  • 核定征收企业所得税应税所得率
  • 建筑劳务预缴税款后怎么申报
  • 生产成本包括什么科目内容
  • 销售预付款会计分录
  • php psr2
  • 进口小汽车消费税率
  • win10 打开远程连接
  • 稳岗补贴需要缴纳什么税
  • 借款利息还能再算利息吗
  • 米苏拉塔是哪个国家
  • php抽象函数
  • php生成随机字母数字代码
  • php定义一个二维数组
  • 常用的成本计算方法有哪些
  • css 自定义变量
  • php判断包含指定内容
  • 应收账款质押融资平台
  • 职工福利能开专票吗
  • 公司组织员工旅游费可以在税前扣除吗
  • 地税代开的发票怎么计提税款?
  • 计提工资大于实发工资企业所得税怎么算
  • sql 列转行
  • mysql编程一般步骤
  • 企业所得税税款可以税前扣除吗
  • 企业的经营业务
  • 增值税期末留抵退税原因采集确认单
  • 法定盈余公积和任意盈余公积可用于
  • 预缴所得税科目
  • 社会团体会员费怎么入账
  • 哪里还有备用金可以借
  • 餐饮赠券的会计分录
  • 业务提成一般怎么拿的
  • 银行业现金流量表
  • 电子发票必须要打印出来才能作为入账依据
  • sqlserver合并脚本工具
  • win8如何调整电脑屏幕亮度
  • 自定义设置微信来电铃声
  • win8.1 开机进桌面
  • ati2sgag.exe进程安全吗 ati2sgag进程信息查询
  • 密钥升级win10专业版有问题吗
  • 解决VMware下64位linux系统不支持全虚拟化的办法
  • 免安装版怎么用
  • [置顶]bilinovel
  • javascript怎么用
  • excel2016默认字体
  • java timer
  • python自动发邮件内容
  • es6新方法有哪些
  • 怎么用html做一个留言板
  • js动态给table添加行
  • linux特殊符号转义
  • unity 内存管理
  • jquery日期插件
  • rsa加密算法python
  • adb工具使用说明文档下载
  • Qt for Android - ANT_HOME is set incorrectly or ant could not be located
  • 重庆税务局官网发票查询
  • 电信业务发票
  • a类棉b类棉c类的区别
  • 国税总局北京税务局
  • 个人所得税税率怎么算
  • 河北税务怎么打不开网页
  • 河北地税局电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设