什么是Java的守护线程?

574 阅读3分钟

    欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。

    守护线程是一种支持性线程,主要用于后台调度以及支持性的工作。守护线程具备自动结束生命周期的特性,而非守护线程则不具备。     如果对上面的概念一知半解的话,我们先来看一个简单的例子,明白守护线程的执行情况:

public class MyDaemon implements Runnable {
    @Override
    public void run() {
        System.out.println("********守护线程********");
    }
}
public class MyDaemonTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyDaemon(), "守护线程");
        thread.setDaemon(true);
        thread.start();
        System.out.println("******main线程执行结束******");
    }
}

    请猜测一下上面的执行结果,如果多次执行就会发现,运行的结果会有两种情况。第一种情况最容易出现,第二种情况在多次运行上面的程序之后偶尔会出现。

******main线程执行结束******

******main线程执行结束******
********守护进程********

    这里如果不明白守护进程的真正意义就会存在疑问,为什么会出现上面的两种情况呢?这里我根据这个例子再次解释下文章开头对守护线程的描述。

    首先一个线程的运行肯定是由另外一个线程启动的,在上面的例子中我们运行了“main()”方法,也就是启动了一个主线程。然后“main()”方法中调用了我们自定义的线程“MyDaemon()”,之后我们给“MyDaemon()”这个线程设置成为了守护进程。守护进程有个特点就是当所有非守护线程都运行结束时,JVM退出,进程结束。我来画个图给大家解释一下这句话的意思。     为了验证上述的表达,我们在将之前的“MyDaemon()”进行一下修改,然后对比一下结果:

public class MyDaemon implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("********守护进程********");
        }
    }
}

    把“MyDaemonTest()”中的守护进程设置为false。

public class MyDaemonTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyDaemon(), "守护进程");
        thread.setDaemon(false);
        thread.start();
        System.out.println("******main线程执行结束******");
    }
}

    这个线程运行之后的执行结果是“MyDaemon()”中的内容一致循环不断地输出,JVM不会退出。

    我们再来对比下面这个稍微改动的程序,只需要把上述的“thread.setDaemon(false)”修改成“thread.setDaemon(true)”即可:

public class MyDaemonTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyDaemon(), "守护进程");
        thread.setDaemon(true);
        thread.start();
        System.out.println("******main线程执行结束******");
    }
}

    这次运行结果是JVM可以自动退出。

    假如在主要线程运行的时候,你还想让一个不太重要的线程执行任务,但是又想等主要线程退出时不太重要的线程也立刻结束。或许你想到了使用中断的方式,但是如果将不太重要的线程设置为守护进程使用则更加简单。

    注意:在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源 的逻辑,因为它有可能没有被执行就已经退出了。     欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。