继承thread类实现守护线程必须在start()前调用setdaemon(true),否则抛illegalthreadstateexception;默认为用户线程;守护线程随jvm退出而终止,适用于后台任务,不保证执行完成。

继承 Thread 类实现守护线程,核心在于:必须在调用 start() 之前,通过 setDaemon(true) 设置为守护线程;一旦线程已启动,再调用该方法会抛出 IllegalThreadStateException。
守护线程的设置时机很关键
Java 规定守护线程状态只能在线程处于“新建(NEW)”状态时修改。也就是说,必须在 start() 之前设置:
- 正确写法:构造完线程对象后、
start()前调用setDaemon(true) - 错误写法:先
start(),再setDaemon(true)→ 运行时报异常 - 如果没显式设置,默认是用户线程(非守护线程)
继承 Thread 类的典型写法
以自定义线程类为例:
class MyDaemonThread extends Thread {
public MyDaemonThread(String name) {
super(name);
setDaemon(true); // ✅ 必须在此处设,此时线程尚未启动
}
@Override
public void run() {
while (!Thread.interrupted()) {
System.out.println("守护线程运行中...");
try { Thread.sleep(1000); } catch (InterruptedException e) { break; }
}
System.out.println("守护线程退出");
}
}
使用时直接 new 并 start:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
new MyDaemonThread("watchdog").start();
主线程结束后,JVM 会自动终止所有守护线程,不等待它们执行完毕。
守护线程的生命周期依赖于用户线程
守护线程不会阻止 JVM 退出。只要所有用户线程(包括 main 线程)结束,即使守护线程仍在运行,JVM 也会立即关闭:
- 守护线程适合做后台支持任务,比如日志轮转、监控心跳、资源清理
- 不能用于执行关键业务逻辑或需要保证完成的任务(如文件写入未刷盘就可能丢失)
- 守护线程中启动的新线程,默认继承其守护状态(即也是守护线程)
与 Runnable + Thread 的区别不大,但继承需更谨慎
用 Runnable 方式创建线程时,守护属性由 Thread 实例控制,逻辑更清晰:
Thread t = new Thread(() -> { /* 任务 */ });
t.setDaemon(true); // 明确对 Thread 实例操作
t.start();
而继承 Thread 时,容易误把 setDaemon() 写在 run() 里或 start() 后,导致失效或异常。建议优先使用组合(Runnable)而非继承,职责更分明。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










