守护线程

概念

线程分为守护线程和非守护线程。

守护线程是指在程序运行的时候在后台提供一种服务的线程,比如垃圾回收线程就是一个守护线程;当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止

守护线程和非守护线程不同之处在于JVM虚拟机的结束:如果非守护线程已经全部结束,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

使用方式

使用 thread.setDaemon可以把线程设置成守护线程,且必须在start之前,否则会跑出一个IllegalThreadStateException异常;
而且不能把正在运行的线程设置成守护线程

案例

非守护:

public class Daemon {
    public static void main(String[] args) {
        //非守护线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i =0 ; i< 10; i ++) {
                    System.out.println("用户线程"+i);
                }
            }
        });
        thread.start();
        //主线程
        for (int i =0 ; i< 5; i ++) {
            System.out.println("主线线程"+i);
        }
        System.out.println("主线程执行完毕");
    }
}
执行结果
![image.png](https://upload-images.jianshu.io/upload_images/17398468-d2eb6ac9834926b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

可以看出主线程结束了,非用户线程还在运行

守护线程:

public class Daemon {
    public static void main(String[] args) {
        //守护线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i =0 ; i< 10; i ++) {
                    System.out.println("用户线程"+i);
                }
            }
        });
        thread.setDaemon(true);
        thread.start();
        //主线程
        for (int i =0 ; i< 5; i ++) {
            System.out.println("主线线程"+i);
        }
        System.out.println("主线程执行完毕");
    }
}
执行结果
![image.png](https://upload-images.jianshu.io/upload_images/17398468-95950585672106a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
看出主线程结束了,守护线程也结束了

你可能感兴趣的:(守护线程)