在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 

用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。 

定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。
优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为
守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。
example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的
Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是
JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于
实时监控和管理系统中的可回收资源。
生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且
周期性地执行某种任务或等待处理某些发生的事件。也就是
说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是
什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个
或以上的非守护线程则JVM不会退出。

public class DaemonTest {
    public static void main(String[] args) {
        God god = new God();
        you you = new you();
        Thread t = new Thread(god);
        Thread t1 = new Thread(you);
        t.setDaemon(true);//将线程调整为守护线程
        t.start();
        t1.start();
    }
}


class God implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 365; i++) {
            System.out.println("bless you。。。");
        }
    }
}
class you implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 365; i++) {
            System.out.println("活的很精彩。。。");
        }
    }
}

运行结果

bless you。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
活的很精彩。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。
bless you。。。