Java 守护线程

一、什么是守护线程

在说守护线程之前,我们先说一下什么是用户线程。

用户线程:我们平常创建的普通线程
守护线程(即 Daemon thread):是个服务线程,用来服务于用户线程;不需要上层逻辑介入,当然我们也可以手动创建一个守护线程。在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。

二、为什么需要守护线程

存在任意一个用户线程的时候,JVM就不会退出。那么JVM 程序在什么情况下能够正常退出?

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

上面这句话来自 JDK 官方文档,意思是:
当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出。

首先要明白,当存在任意一个用户线程的时候,JVM就不会退出
在这里插入图片描述
在这里插入图片描述
如果这个用户线程不结束,JVM进程就无法结束。这就导致一个问题:由谁负责结束这个线程?所以java就提供了守护线程(Daemon Thread)来帮助我们解决这一个问题。

三、如何使用

使用很简单,只是在调用start()方法前,调用setDaemon(true)把该线程标记为守护线程
如何检查一个线程是守护线程还是用户线程:使用isDaemon()方法
在这里插入图片描述
在这里插入图片描述
通过控制台的输出,我们可以看到,当主线程退出时,JVM 会随之退出运行,守护线程同时也会被回收,即使你里面是个死循环也不碍事。

注意:

  • thread.setDaemon(true) 必须在 thread.start() 之前设置,否则会抛出 IllegalThreadStateException 异常。
  • 在Daemon线程中产生的新线程也是Daemon的。

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

在上面,我们已经知道了,如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。

JVM 中的垃圾回收线程就是典型的守护线程。如果说不具备该特性,JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出。由此可见,守护线程的重要性了。

垃圾回收是一个一直需要运行的机制,但是当没有用户线程的时候,也就不需要垃圾回收线程了,守护线程刚好满足这样的需求。

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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuZhan7710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值