本博文主要是为了解释三个问题:
第一,什么是守护线程?
第二,为什么要有守护线程?
第三,何时需要守护线程?
上面的代码存在两个线程,一个是由 JVM 启动的 main 线程,另外一个则是我们自己创建的线程 Thread,运行上面的这段代码,你会发现 JVM 进程永远不会退出,即使 main 线程正常结束了自己的生命周期,原因就是因为在 JVM 进程中还存在一个非守护线程在运行。 如果打开是否设置为守护线程的注释,将自己创建的 Thread 设置为了守护线程,那么 main 进程结束生命周期后,JVM 也会随之退出运行,当然 Thread 线程也会结束。
为什么要?
如果一个 JVM 进程中没有一个非守护线程,那么 JVM 会退出,也就是说守护线程具备自动结束生命周期的特性,而非守护线程则不具备这个特点,试想一下如果 JVM 进程的垃圾回收线程是非守护线程,如果 main 线程完成了工作, JVM却无法退出,因为垃圾回收线程还在正常的工作。再比如有一个简单的游戏程序,其中有一个线程正在与服务器不断交互以获取玩家最新的信息,若希望在退出游戏客户端的时候,这些数据同步的工作也能够立即结束,这时候就需要一个守护线程了等等。
何时需要?
守护线程经常用作执行一些后台任务,因此有时它也被称为后台线程,当你希望关闭某些线程的时候,或者退出 JVM 进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。