0

0

什么是Java的守护线程(Daemon Thread)_垃圾回收线程与用户线程的区别

P粉602998670

P粉602998670

发布时间:2026-03-12 10:57:11

|

286人浏览过

|

来源于php中文网

原创

守护线程是jvm退出时不会阻止进程终止的线程,所有非守护线程结束后jvm立即退出,其典型代表是垃圾回收线程;必须在start()前设置setdaemon(true),且状态不可逆,不可用于关键清理任务。

什么是java的守护线程(daemon thread)_垃圾回收线程与用户线程的区别

守护线程是什么:一个“随 JVM 一起消失”的线程

守护线程(Daemon Thread)不是后台服务,也不是高级线程类型——它只是 JVM 关机时不会阻止退出的线程。只要所有非守护线程结束,JVM 就立刻终止,不管守护线程是否还在跑。

典型例子:GarbageCollector 线程就是守护线程;你写的 main 方法启动的主线程默认是非守护的。

  • Thread.setDaemon(true) 必须在 start() 之前调用,否则抛 IllegalThreadStateException
  • 守护线程创建的子线程默认继承其守护状态(即也是守护线程)
  • 守护线程里不能做关键清理工作(比如写日志、关数据库连接),因为可能被突然中断

怎么判断一个线程是不是守护线程

直接查 isDaemon() 返回值就行,别靠名字或逻辑猜:

Thread t = new Thread(() -> { /* ... */ });
System.out.println(t.isDaemon()); // false —— 新线程默认非守护
t.setDaemon(true);
System.out.println(t.isDaemon()); // true
  • main 线程永远是非守护的,哪怕你在 main 里调了 setDaemon(true)(无效,会抛异常)
  • 守护状态不可逆:设成 true 后不能改回 false
  • 注意 IDE 调试时可能看到多个守护线程(如 Monitor Ctrl-Break),它们是工具线程,不影响你的逻辑

垃圾回收线程为什么必须是守护线程

GC 线程本质是 JVM 内部调度的辅助线程,它的存在只为服务用户线程。一旦所有用户线程结束,JVM 没有继续运行的理由,GC 也就失去意义。

智简简历
智简简历

免费AI简历制作工具,智能生成、可视化编辑、多格式导出。

下载

立即学习Java免费学习笔记(深入)”;

  • 如果 GC 是非守护线程,JVM 就得等它“自己停下来”,但 GC 没有明确退出点,会导致进程卡住不退出
  • 不同 JVM 实现(HotSpot / OpenJ9)的 GC 线程名不同,但都标记为 daemon,可通过 jstack <pid></pid> 验证
  • 你无法手动启动或控制 GC 线程;调用 System.gc() 只是建议,不创建新线程

常见误用:把定时任务、日志刷盘线程设成守护线程

这类线程看起来“后台运行”,但实际承担关键职责——设成守护线程后,主流程一结束,它们就被粗暴中断,数据可能丢失。

  • Spring 的 @Scheduled 默认使用非守护线程池;若手动配 ScheduledThreadPoolExecutor,需确认 threadFactory 没设 daemon=true
  • Log4j2 的异步日志器(AsyncLogger)内部线程是守护的,但它自带缓冲和优雅关闭机制;自研类似逻辑时千万别照搬
  • Runtime.addShutdownHook() 注册的钩子线程本身是非守护的,且 JVM 保证它执行完才退出——这才是做清理的正地方

守护线程的边界很窄:只适合纯辅助、无状态、可随时丢弃的任务。多数业务场景里,宁可多花几毫秒等它做完,也不要赌它“刚好跑完了”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

156

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

99

2025.12.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

385

2023.06.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号