来自:小哈学Java

目录

一、什么是守护线程

二、守护线程的作用及应用场景

三、总结

一、什么是守护线程

守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我们需要知道一个问题,那就是:

JVM 程序在什么情况下能够正常退出?

The Java Virtual Machine exits when the only threads running are all daemon threads.

上面这句话来自 JDK 官方文档,意思是:

当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出。

理解起来有点拗口,看完下面的代码你就懂了 。^_^

  • ①:创建一个非守护线程;

  • ②:模拟非守护线程不退出的情况;

  • ③:启动线程;

  • ④:主线程即将退出;

运行这段代码,猜猜看,JVM 进程是否能够正常退出呢?

可以看到因为有一个非守护线程一直在后台运行着,JVM 无法正常退出。那么,如果说正在运行的是个守护线程,结果又会怎么样呢?

  • ①:添加一个钩子(Hook)线程, 用来监听 JVM 退出,并输出日志;

关于 Hook (钩子) 线程可以看我之前的文章:《面试官: 什么是 Hook (钩子) 线程以及应用场景?》

  • ②:通过 setDaemon(true)将该线程为守护线程;

再次运行代码,瞅瞅效果:

可以看到,当主线程退出时,JVM 会随之退出运行,守护线程同时也会被回收,即使你里面是个死循环也不碍事。

二、守护线程的作用及应用场景

通过上面的示例代码,相信你已经了解了守护线程和普通线程之间的区别,那么,我们来讨论一下为什么需要守护线程,以及何时使用,它的应用场景是什么?

上面,我们已经知道了,如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点

JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?

当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。

通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选。

三、总结

本文中,我们学习了什么是守护线程,通过示例代码了解了守护线程的特性,以及守护线程的作用,和应用场景。最后,如果看完此文有所收获,不妨点个关注哈。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

面试官: 谈谈什么是守护线程以及作用 ?相关推荐

  1. 面试官问:为什么 Java 线程没有Running状态?我懵了

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 title: 面 ...

  2. 面试官:谈谈分库分表吧?

    面试官:"有并发的经验没?"  应聘者:"有一点."   面试官:"那你们为了处理并发,做了哪些优化?"   应聘者:"前后端分离 ...

  3. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?

    引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...

  4. 面试官让我讲下线程的WAITING状态,我笑了

    转载自  面试官让我讲下线程的WAITING状态,我笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑... 一个正在无限期等待另一 ...

  5. 面试官问:为什么 Java 线程没有 Running 状态?我懵了

    转载自 面试官问:为什么 Java 线程没有 Running 状态?我懵了 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNN ...

  6. 面试官让我讲下线程的TIMED_WAITING状态,我又笑了

    转载自  面试官让我讲下线程的TIMED_WAITING状态,我又笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑,可以撮这里 - ...

  7. java线程池原理简答_面试官让我讲讲Java线程池的实现原理,我笑了...

    期待与你,一起进步 随着cpu核数越来越多,不可避免的利用多线程技术以充分利用其计算能力.所以,多线程技术是服务端开发人员必须掌握的技术. 线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就 ...

  8. 面试官问我:创建线程有几种方式?我笑了

    前言 多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面. 比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等. 接下 ...

  9. 如何把class里的vector结构体memcpy出来_面试官:请说出线程安全的 ArrayList 有哪些,除了Vector...

    以下环境是 JDK 1.8 ArrayList 的初始容量 面试官:你看过 ArrayList 的源码? Python 小星:看过 面试官:那你说下ArrayList 的初始容量是多少? Python ...

最新文章

  1. 边沿检测与信号同步?
  2. 一些今天看到的好句子
  3. 我来告诉你优秀的产品经理是如何管理需求的
  4. hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)
  5. 多层GCN的over-smooth问题
  6. django下创建多个app,如何设置每个app的urls
  7. 2017-02-26,周日整理
  8. vs关于_CRT_SECURE_NO_WARNINGS警告说明
  9. 读书百客:《渔家傲·天接云涛连晓雾》评赏
  10. 数据分析的同比和环比以及其在excel中的应用
  11. 1003【顺序结构】A+B 问题
  12. 关于不定积分和积分上限函数区别的简单讨论
  13. 外星人入侵小游戏十二章十三章实现
  14. NLP papers
  15. 分享一个H5使用JQ首字母排序的通讯录
  16. 冒泡排序(代码+解析)
  17. 【毕业生】简历究竟应该怎么“写”?
  18. Python笔记-爬取Boss直聘的招聘信息
  19. 2读1写通用寄存器堆设计实现
  20. 关于Java面向对象程序设计原则之一——开闭原则的思考与分享

热门文章

  1. linux的ftp226,ftp服务器 不返回 226
  2. 【python】向上取整 向下取整
  3. linux 磁盘分区情况6,Linux磁盘分区介绍
  4. 如何在python中创建列表副本,在Python中切片列表而不生成副本
  5. python环境问题踩坑
  6. Unreal Engine* 4.19 的 CPU 功能检测
  7. 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析
  8. 2014.09线上课堂报名帖:敏捷个人手机应用使用
  9. new操作符具体干了啥
  10. Spring中ThreadPoolTaskExecutor的线程调度及问题