java线程分为用户线程和守护线程
一般不做特别说明配置,默认都是用户线程
用户线程:是系统的工作线程,它会完成这个程序需要完成的业务操作。
守护线程:是一种特殊的线程,为其他线程服务的,在后台完成一些系统性的服务,如:垃圾回收线程。
守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以假如当系统只剩下守护线程的时候,java虚拟机会自动退出。
判断线程是用户线程还是守护线程有一个属性,叫isDaemon
true表示是守护线程
false表示是用户线程
public class Test2 { public static void main(String[] args) { new Thread(() -> { System.out.println(Thread.currentThread().getName()+" "+Thread.currentThread().isDaemon()); },"t1").start(); } }
编辑
结果为false,表示不是守护线程,也就是用户线程
import java.util.concurrent.TimeUnit; public class Test2 { public static void main(String[] args) { new Thread(() -> { System.out.println(Thread.currentThread().getName()+" "+Thread.currentThread().isDaemon()); while (true){ } },"t1").start(); //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" end"); } }
编辑
可以看到,线程t1是没结束的,但是主线程已经执行完了,但是此时程序并没有退出,说明用户线程之间互不影响。
但是当我们把t1设置成守护线程时
编辑
编辑
主线程结束,程序就退出了。