什么是守护线程

<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.csdn.net/so/search?q=Virtual&amp;spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=Virtual&amp;spm=1001.2101.3001.7020&quot;,&quot;extra&quot;:&quot;{\&quot;searchword\&quot;:\&quot;Virtual\&quot;}&quot;}" 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值