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

主线程退出后仍有非Daemon线程运行时,Daemon线程是否持续运行?

关于Daemon线程在主线程退出后、非Daemon线程仍运行时的行为解析

嘿,这个问题问到点子上了!我来给你把这个逻辑掰扯得明明白白:

首先得搞清楚Daemon线程的核心规则:Daemon线程的存活完全依赖于JVM中是否还有非Daemon线程在运行——只要有至少一个非Daemon线程还没结束,JVM就会保持运行状态,所有Daemon线程该干嘛干嘛,不会被强制终止。

那主线程退出的情况呢?主线程本身是个非Daemon线程,但它退出之后,只要还有其他非Daemon线程在跑,JVM就不会退出。这时候Daemon线程根本不会受到主线程退出的影响,会继续执行自己的任务,直到最后一个非Daemon线程终止,JVM才会启动退出流程,这时候才会把所有Daemon线程强行停掉。

举个实际的Java代码例子你就直观了:

public class DaemonThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        // 启动一个非Daemon线程,模拟主线程退出后仍长期运行的场景
        Thread nonDaemonWorker = new Thread(() -> {
            try {
                System.out.println("非Daemon线程启动,将运行10秒");
                Thread.sleep(10000); // 睡10秒,确保主线程先退出
                System.out.println("非Daemon线程执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        nonDaemonWorker.start();

        // 启动一个Daemon线程
        Thread daemonWorker = new Thread(() -> {
            int counter = 0;
            while (true) {
                System.out.println("Daemon线程正在运行,当前计数:" + counter++);
                try {
                    Thread.sleep(1000); // 每秒打印一次
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        daemonWorker.setDaemon(true);
        daemonWorker.start();

        // 主线程休眠2秒后退出
        Thread.sleep(2000);
        System.out.println("主线程退出");
    }
}

运行这段代码你会看到:主线程在2秒后退出,但Daemon线程会继续每秒打印计数,直到10秒后非Daemon线程执行完毕,JVM才会终止,Daemon线程才会停止输出。

总结一下核心结论:

  • 主线程退出≠JVM退出,JVM的退出条件是所有非Daemon线程都终止
  • 只要还有非Daemon线程在运行,不管主线程是否已经退出,Daemon线程都会持续运行,不会被阻止或提前终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:13