https://zhuanlan.zhihu.com/p/74643577
为操作系统分配资源的单位是进程,就算main线程退出了,进程也还在.资源还在.在进程看来,线程应该都是平级的,没有父子关系.
结论:会的
原因:
- JVM会在所有的非守护线程(用户线程)执行完毕后退出;main线程是用户线程;
- 仅有main线程一个用户线程执行完毕,不能决定JVM是否退出,也即是说main线程并不一定是最后一个退出的线程。
如果你希望在main线程退出后,所有其他线程也退出.那么你可以把其他线程都设置为守护线程,也就是setDaemon(true). 对于线程池,你可以在main线程退出的的时候手动进行一些处理.比如shutdown等方法.
对比:
- 其他线程会继续执行的情况:
package com.mashibing.juc.c_000;
import java.util.concurrent.TimeUnit;
public class T01_WhatIsThread {
private static class T1 extends Thread {
@Override
public void run() {
for(int i=0; i<10; i++) {
try {
TimeUnit.MICROSECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T1");
}
}
}
public static void main(String[] args) {
new T1().start();
System.out.println("main");
}
}
- main运行完后强制退出JVM,使其他线程不执行:
public static void main(String[] args) {
new T1().start();
System.out.println("main");
/*使用exit 0 退出JVM,但是使用return并达不到效果*/
System.exit(0);
}
}
- 将其他线程设置为守护线程,当main退出后,守护线程不再执行“
public static void main(String[] args) {
new T1().run();
Thread t1 = new T1();
t1.setDaemon(true);
t1.start();
System.out.println("main");
}