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

Java中子线程能否存活超过主线程?实际代码表现存疑

为什么Java主线程结束后子线程还在运行?

嘿,我来帮你理清这个常见的误区~

你之前的认知“子线程不会比主线程存活更久”其实是只适用于守护线程(Daemon Thread),而Java里默认创建的线程都是用户线程(User Thread),这两者的行为有本质区别:

  • 用户线程:是JVM必须等待其执行完成才会退出的线程。哪怕创建它的主线程已经结束,只要还有用户线程在运行,JVM就会继续保持存活状态,直到所有用户线程执行完毕。
  • 守护线程:是依赖于创建它的线程的“后台线程”。当所有用户线程都结束后,JVM会自动终止所有守护线程,不管它们有没有执行完。

回到你的代码,你创建的NewThread应该是一个默认的用户线程(比如在它的构造方法里调用了start()),所以当主线程睡1秒后输出并结束时,这个子线程作为用户线程会继续运行,直到自己的任务完成。

如果想让子线程随主线程一起结束,你需要把它设置为守护线程,示例代码如下:

public class Main { 
    public static void main(String[] args) { 
        // 创建子线程实例
        Thread childThread = new NewThread();
        // 设置为守护线程,必须在start()之前调用!
        childThread.setDaemon(true);
        // 启动线程
        childThread.start();

        try { 
            Thread.sleep(1000); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } 
        System.out.println("\nThis is main thread finishing...");
    }
}

class NewThread extends Thread {
    @Override
    public void run() {
        // 模拟子线程的长时间任务
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(500);
                System.out.println("子线程正在运行:" + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行上面的代码你会发现,主线程结束后,子线程(守护线程)会被JVM强制终止,不会继续输出后续内容。

最后再划个重点:

  • 线程的守护属性必须在调用start()方法之前设置,之后再调用setDaemon()会抛出IllegalThreadStateException
  • 不要在守护线程里执行需要保证完成的任务(比如文件写入、数据库操作),因为它可能随时被终止

内容的提问来源于stack exchange,提问作者securecurve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:30:14