守护线程:是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程
用户线程:是系统的工作线程,它会完成这个程序需要完成的业务操作;我们使用 Thread类创建的线程在默认情况下都属于用户线程
Thread.setDaemon(false) 设置为用户线程Thread.setDaemon(true) 设置为守护线程 在很多面试地方,都会问一个问题,就是下面的代码启动创建了几个线程,分别是什么线程类型
public static void main(String[] args) {}
这个例子对于有些小伙伴来说还是不太能理解,这里呢再举个有具体代码的例子
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用户线程结束后,守护线程也会停止运行;
setDaemon() 方法必须在线程的 start() 方法之前调用,在后面调用会报异常,并且不起效
上一篇:Vue学习笔记
下一篇:.net、C#单元测试xUnit