一、概念:
守护线程:是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程
用户线程:是系统的工作线程,它会完成这个程序需要完成的业务操作;我们使用 Thread
类创建的线程在默认情况下都属于用户线程
二、如何判断是守护线程还是用户线程:
- 通过
Thread.setDaemon(false)
设置为用户线程 - 通过
Thread.setDaemon(true)
设置为守护线程
默认是用户线程
三、举个例子
在很多面试地方,都会问一个问题,就是下面的代码启动创建了几个线程,分别是什么线程类型
public static void main(String[] args) {}
这就是一个最简单的java中的项目入口,在这个过程中,是有2个线程:1个main主线程【用户线程】+GC守护线程;
这个例子对于有些小伙伴来说还是不太能理解,这里呢再举个有具体代码的例子
public static void main(String[] args) {
//创建一个线程,内部类里面在对线程类型进行判断,然后有个循环
Thread a = new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" 是: \t"
+(Thread.currentThread().isDaemon()?"守护线程":"用户线程")
);
while (true){
}
}, "a");
//线程启动
a.start();
//主线程输出
System.out.println(Thread.currentThread().getName()+"\t"+"主线程执行,我是"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
}
效果图:
从图上可以看到,这个程序还在执行,然后控制台输出:a线程对象是一个用户线程,主函数main也是一个用户线程,当主函数main执行完毕后,a线程对象还在继续执行,因为里面有一个while循环,这个大家应该能理解;
那么,我将对a线程对象设置为守护对象,在25行之前加上下面的代码,看看是什么效果,:
a.setDaemon(true);
运行效果:
大家现在可以看到,这个程序已经停止了,唯一改变的地方就是将a线程对象改成了守护线程类型,所以当main用户线程结束后,守护线程也会停止运行;