You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:07:10