守护线程

Posted lhh666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了守护线程相关的知识,希望对你有一定的参考价值。

博客博客,我来写博客,可能会有错误。奥利给!

守护线程Deamon,它有啥用。

在《java高并发编程详解》是这样说的:

守护线程是一类比较特殊的线程,一般用于处理一些后台工作,比如JDK的垃圾回收线程。在正常情况下,若JVM中没有一个非守护线程,则JVM的进程会退出。(看到这一句,心里what?***)

先了解一下线程的分类,有主线程、用户线程和守护线程(也不知道可不可以这样分,易于理解就行),Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程。当所有线程都运行结束时,JVM退出,进程结束。如果有一个线程没有退出,JVM进程就不会退出。所以,必须保证所有线程都能及时结束。但是有一些线程它就是一直运行,像垃圾回收线程,如果JVM进程的垃圾回收线程是非守护线程,main线程完成工作,JVM无法退出,垃圾回收线程运行着,还在正常的工作,但是我们工作完成了,JVM要退出,所以这个时候守护线程闪亮登场。

守护线程具备自动结束生命周期的特性。在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。因此,JVM退出时,不必关心守护线程是否已结束。

守护线程是指为其他线程服务的线程。常常用作于执行一些后台任务,有时也被称为后台线程。

下面一个简单的程序,来认识一下,守护线程。

public class DaemonThread {
    public static void main(String[] args) throws InterruptedException{
        //main线程开始
        Thread thread = new Thread(() ->
        {
          while(true)
          {
              System.out.println("my thread is running");
              try
              {
                  Thread.sleep(500);
              }catch (InterruptedException e)
              {
                  e.printStackTrace();
              }
          }
        });
        thread.setDaemon(true); //将thread设置为守护线程
        thread.start();//启动thread线程
        Thread.sleep(2000);
        System.out.println("Main thread finished lifecycle.");
    }
}

控制台结果:

技术图片

 当我们没有把thread线程设置为守护线程,thread就会一直运行,没人结束它。当我们把thread.setDaemon(true)注释掉,控制台结果:

技术图片

 

 

参考:《java高并发编程详解》https://www.liaoxuefeng.com/wiki/1252599548343744/1306580788183074
https://www.jianshu.com/p/6b68af3e5738

以上是关于守护线程的主要内容,如果未能解决你的问题,请参考以下文章

守护线程与守护进程

JUC并发编程 -- 主线程与守护线程

54_并发编程-线程-守护线程

网络编程之多线程——守护线程

2-5 守护线程

5.1.14 守护线程