Java中守护线程介绍及使用

网友投稿 243 2022-09-03


Java中守护线程介绍及使用

目录一、什么是守护线程二、为什么需要守护线程三、如何使用注意:总结

一、什么是守护线程

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

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

二、为什么需要守护线程

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

The java Virtual Machine exits when http://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 退出时,线程能够自动关闭,此时,守护线程是你的首选。

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:openAI的仿真环境Gym Retro的Python API接口(续1)—— 游戏过程记录及回放(openAi)
下一篇:分享某Python下的mpi教程 —— A Python Introduction to Parallel Programming(mpi python)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~