Java 多线程默认不是守护线程,当使用setDaemon它设置为守护线程时,如果此时Java虚拟机中没有别的正在执行的非守护线程,那么它会随着main的结束而结束,下面我们测试一下:
将main主方法线程传递入OtherThread类中,再在TestThreadExit方法中将main主方法线程停止掉,这里为了能立刻生效所以使用了stop方法(stop 方法是不安全的,不推荐使用,可以换成interrupt方法中断,但它不会立刻生效)
public class TestThreadExit {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread();
OtherThread otherThread = new OtherThread(mainThread);
otherThread.TestThreadExit();
}
}
class OtherThread{
private Thread main;
public OtherThread(Thread main) {
this.main = main;
}
public void TestThreadExit(){
Thread thread = new Thread(() -> {
try {
System.out.println("结束main线程");
main.stop();
System.out.println(main.getState() + "-->main");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getState() + "-->thread");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.setDaemon(true);
thread.start();
}
}
打印结果:
结束main线程
当我们将主方法线程停止之后,程序直接停止,OtherThread线程中的后续方法并没有执行,那么我们再将它设置为非守护线程试一下:
public void TestThreadExit(){
new Thread(() -> {
try {
System.out.println("结束main线程");
main.stop();
System.out.println(main.getState() + "-->main");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getState() + "-->thread");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
打印结果:
结束main线程
TERMINATED-->main
RUNNABLE-->thread
可以看出main主线程已经直接停止了,而OtherThread这个线程还在继续执行,程序并没有直接退出
当我们调用System.exit()方法时,JVM虚拟机关闭,程序退出,所有的线程都会终结