System.exit() 会立即终止整个JVM,无论调用线程是否为守护线程;JVM停止所有线程、执行shutdown hooks、释放资源并退出,状态码由参数指定。

Java程序调用 System.exit() 会立即终止整个JVM,无论该调用发生在主线程还是守护线程中——守护线程本身不影响 System.exit() 的执行效果。
System.exit() 的本质是JVM级终止
System.exit(int status) 不是“退出当前线程”,而是向JVM发出强制关闭指令。JVM收到后会:
- 立即停止所有线程(包括用户线程和守护线程)的执行
- 运行已注册的 shutdown hooks(如果尚未执行)
- 释放资源并退出进程,返回指定状态码
因此,哪怕你在某个守护线程里调用 System.exit(0),效果和在 main 线程中调用完全一致:整个程序结束。
守护线程不会阻止 System.exit() 执行
守护线程(Daemon Thread)仅影响 JVM 的自动退出条件:当所有非守护线程结束时,JVM 自动退出。但 System.exit() 是主动干预,不依赖线程类型判断。
立即学习“Java免费学习笔记(深入)”;
例如:
Thread daemon = new Thread(() -> {
System.out.println("守护线程启动");
try { Thread.sleep(1000); } catch (InterruptedException e) {}
System.exit(1); // 这行会生效,JVM立刻退出
});
daemon.setDaemon(true);
daemon.start();
这段代码会输出“守护线程启动”,然后 JVM 退出,main 线程和其他线程均被强制中断。
需要注意的常见误区
开发者有时误以为:
- 守护线程里调用
System.exit()会被忽略 —— 实际不会,它照样终止JVM - 守护线程正在运行时,JVM无法退出 —— 这只适用于“自然退出”(无
System.exit()时),与主动退出无关 - shutdown hooks 在守护线程中注册就无效 —— 只要 hook 已注册且未被移除,
System.exit()仍会触发它
替代方案:优雅退出更可控
若想避免粗暴终止,建议用协作式退出机制:
- 使用 volatile 标志位通知各线程自行结束
- 主线程等待关键线程完成(如
join())再退出 - 通过
Runtime.getRuntime().addShutdownHook()统一清理资源
这样既能保证守护线程按需退出,又避免因任意线程调用 System.exit() 导致不可预期的中断。


















