线程我们分为 用户线程和守护线程,二者的区别在于:虚拟机需要等用户线程执行完毕才停止,而不需要等待守护线程执行完毕。
举一个简单的例子来说就是,如果你的用户线程是一个有限的循环,而守护线程是一个无线的循环,那么当我们的用户线程执行完毕之后程序就会结束,并不会因为守护线程是无线循环而导致程序不会结束。所以一般守护线程用来监控内存、垃圾回收、后台记录操作等。
守护线程
正常的线程都是用户线程,守护线程我们需要调用 setDaemon(boolean on) 方法 来把正常线程变为守护线程,参数为 true 的时候是守护线程。
实例分析
例:我们的生命不过 30000 天,而上帝是永恒的,上帝一直在守护我们。当我们逝去的时候上帝就不再呼守护我们了,那么我们用代码来实现这个例子:
public class DaemonTest {
public static void main(String[] args) {
Person person = new Person();
God god = new God();
//把上帝设置为守护线程
Thread thread = new Thread(god);
thread.setDaemon(true);
thread.start();//空气守护线程启动
new Thread(person).start();
}
}
//上帝
class God implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("上帝守护你");
}
}
}
//人类
class Person implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 30000; i++) {
System.out.println("我们开心的活着");
}
System.out.println("=======Game Over=======");
}
}
上面代码运行的结果为
上面运行表示结束了,虽然上帝线程是一个无线循环,但是因为设置为了守护线程,所以当用户线程执行完毕后,守护线程也结束了。因为关闭虚拟机需要时间,所以上帝线程又执行了一段时间。