java中的线程分为两类,分别为daemon线程和user线程,在jvm启动时候会调用main函数,main函数所在的线程就是一个用户线程,在JVM内部还启用了很多守护线程,比如说垃圾回收线程。
当最后一个非守护线程结束时候,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM退出。
即只要有一个用户线程还没结束,正常情况下JVM就不会退出。
因此main线程结束之后,子线程如果是用户线程,那么不一定会结束,jvm也可能不结束
例子如下:
public static void main(String[] args) {
Thread t=new Thread(()->{
for(;;){}
});
t.start();
System.out.println("main thread is over");
}
起了一个线程,里面是个死循环,那么main线程结束之后,子线程会结束吗?
答案是不会,运行jps
可以看到Daemon线程仍然在运行
控制台的按钮也是红色,说明jvm没有退出