Java线程疑问:未调用join,主线程结束后程序为何未终止?
线程终止逻辑误解分析
你对JVM程序终止的条件理解有误:JVM并不会在主线程执行完毕后立刻终止,而是要等待所有非守护线程(即默认创建的用户线程)全部执行完成才会退出。
你的代码里,task1和task2都是通过Thread类创建的默认用户线程:
task1执行逻辑简单,打印后很快就结束了task2会休眠10秒才完成执行,属于未结束的用户线程
主线程执行到System.out.println("main thread ends");就完成了自身任务,但JVM必须等task2这个用户线程执行完毕,才会终止整个程序,所以终端会挂起10秒。
如果想让主线程结束后程序立刻终止,只需把task2设置为守护线程(守护线程会在所有用户线程结束时被JVM强制终止),修改代码如下:
public class Main { public static void main(String[] args) { Thread th1 = new Task1(); Thread th2 = new Task2(); // 设置为守护线程,必须在start()之前调用 th2.setDaemon(true); System.out.println("main thread starts"); th1.start(); th2.start(); System.out.println("main thread ends"); } }
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

