主线程退出后仍有非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
相关产品推荐
相关产品推荐

