守护线程创建的子线程自动继承其守护状态,即子线程实例化时isDaemon()即为true,且不阻止JVM退出;非守护线程创建的子线程默认为非守护线程。

守护线程创建的子线程会自动继承其守护状态,这是 Java 线程规范明确规定的(JLS §17.4.1 和 Thread API 文档)。下面用最简明的原生 Java 代码直接验证这一点,不依赖任何框架或额外工具。
核心验证逻辑
关键思路是:让一个守护线程启动一个新线程,然后观察该新线程的 isDaemon() 返回值,并确认 JVM 是否在主线程结束后立即退出(即子线程未阻止 JVM 终止)。
可运行的验证代码
将以下代码复制到 DaemonInheritanceDemo.java 中并运行:
public class DaemonInheritanceDemo {
public static void main(String[] args) throws InterruptedException {
// 创建并启动一个守护线程
Thread daemonParent = new Thread(() -> {
System.out.println("守护父线程已启动,正在创建子线程...");
// 在守护线程中创建并启动子线程
Thread child = new Thread(() -> {
try {
System.out.println("子线程开始运行,当前是否为守护线程:" + Thread.currentThread().isDaemon());
Thread.sleep(3000); // 故意延长执行时间
System.out.println("子线程执行完毕");
} catch (InterruptedException e) {
System.out.println("子线程被中断");
}
});
System.out.println("父线程中创建的子线程是否为守护线程:" + child.isDaemon());
child.start();
// 父线程自己也休眠一下后结束
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("守护父线程执行完毕,即将退出");
});
daemonParent.setDaemon(true); // 必须在 start() 前设置
daemonParent.start();
// 主线程只等 1 秒就退出
Thread.sleep(1000);
System.out.println("主线程退出 → JVM 将终止");
// 此时:守护父线程和它的子线程都会被强制终止
}
}
运行结果与解读
典型输出如下(注意第三行和最后一行):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
守护父线程已启动,正在创建子线程... 父线程中创建的子线程是否为守护线程:true 子线程开始运行,当前是否为守护线程:true 守护父线程执行完毕,即将退出 主线程退出 → JVM 将终止
说明:
-
子线程创建后、启动前,调用
child.isDaemon()就返回true—— 证明继承发生在new Thread(...)实例化时,而非启动时; - 子线程中再次检查
Thread.currentThread().isDaemon()仍为true—— 确认运行时属性一致; - JVM 在主线程退出后立刻终止,子线程的
"子线程执行完毕"永远不会打印 —— 证明它确实是守护线程,不阻止 JVM 退出。
补充验证:非守护线程创建的子线程默认非守护
只需把上面代码中 daemonParent.setDaemon(true) 这一行注释掉再运行,你会看到:
-
child.isDaemon()变成false; - 主线程退出后 JVM 不会立即结束(因为存在非守护子线程),程序会等待子线程执行完才退出。
这个对比清晰表明:子线程的守护属性由创建它的线程决定,且无需手动设置 —— 这就是“自动继承”的本质。

















