<div id="content_views" class="markdown_views prism-atom-one-dark">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<h2><a name="t0"></a><a id="_0"></a>目录</h2>
<p>一、什么是守护线程<br> 二、守护线程的作用及应用场景<br> 三、总结</p>
<h2><a name="t1"></a><a id="_6"></a>一、什么是守护线程</h2>
<p>守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我们需要知道一个问题,那就是:</p>
<p>JVM 程序在什么情况下能够正常退出?</p>
<p>The Java <a href="https://so.youkuaiyun.com/so/search?q=Virtual&spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{"spm":"1001.2101.3001.7020","dest":"https://so.youkuaiyun.com/so/search?q=Virtual&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"Virtual\"}"}" data-tit="Virtual" data-pretit="virtual">Virtual</a> Machine exits when the only threads running are all daemon threads.</p>
<p>上面这句话来自 JDK 官方文档,意思是:</p>
<p>当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出。</p>
<p>理解起来有点拗口,看完下面的代码你就懂了 。<sup>_</sup><br> <img src="https://img-blog.csdnimg.cn/20201229184019761.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW5nX2RhX3dhbmc=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br> ①:创建一个非守护线程;<br> ②:模拟非守护线程不退出的情况;<br> ③:启动线程;<br> ④:主线程即将退出;<br> 运行这段代码,猜猜看,JVM 进程是否能够正常退出呢?<br> <img src="https://img-blog.csdnimg.cn/20201229184323806.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW5nX2RhX3dhbmc=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<p>可以看到因为有一个非守护线程一直在后台运行着,JVM 无法正常退出。那么,如果说正在运行的是个守护线程,结果又会怎么样呢?</p>
<p><img src="https://img-blog.csdnimg.cn/20201229185845897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW5nX2RhX3dhbmc=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<p>①:添加一个钩子(Hook)线程, 用来监听 JVM 退出,并输出日志;<br> 关于 Hook (钩子) 线程可以看我之前的文章:《Java 多线程之 Hook (钩子) 线程》</p>
<p>②:通过 <code>setDaemon(true)</code>将该线程为守护线程;<br> 再次运行代码,瞅瞅效果:</p>
<p>再次运行代码,瞅瞅效果:<br> <img src="https://img-blog.csdnimg.cn/20201229185546334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW5nX2RhX3dhbmc=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<p>可以看到,当主线程退出时,JVM 会随之退出运行,守护线程同时也会被回收,即使你里面是个死循环也不碍事。</p>
<h2><a name="t2"></a><a id="_42"></a>二、守护线程的作用及应用场景</h2>
<p>通过上面的示例代码,相信你已经了解了守护线程和普通线程之间的区别,那么,我们来讨论一下为什么需要守护线程,以及何时使用,它的应用场景是什么?</p>
<p>上面,我们已经知道了,如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,<strong>守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。</strong></p>
<p>JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?</p>
<p>当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。</p>
<p>通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选。</p>
<h2><a name="t3"></a><a id="_54"></a>三、总结</h2>
<p>本文中,我们学习了什么是守护线程,通过示例代码了解了守护线程的特性,以及守护线程的作用,和应用场景。最后,如果看完此文有所收获,不妨点个关注哈。</p>
<h2><a name="t4"></a><a id="GitHub__58"></a>四、GitHub 示例源码</h2>
<p>https://github.com/weiwosuoai/java-concurrent-tutorial/tree/master/DaemonThread</p>
</div>
什么是守护线程
最新推荐文章于 2025-03-11 21:00:00 发布