0

0

在Java中如何避免线程池的资源泄漏_Java并发资源管理解析

P粉602998670

P粉602998670

发布时间:2026-02-27 09:54:12

|

949人浏览过

|

来源于php中文网

原创

线程池未关闭会导致jvm无法退出和rejectedexecutionexception异常;应先调用shutdown()再配合awaittermination()等待终止,超时后可shutdownnow();推荐使用autocloseable封装或spring的destroymethod自动管理。

在java中如何避免线程池的资源泄漏_java并发资源管理解析

线程池未关闭导致的资源泄漏现象

Java中线程池本身不会自动释放线程,ThreadPoolExecutor 创建的非守护线程会阻止JVM退出;常见表现是应用停止后进程仍在运行,或重启时抛出 java.util.concurrent.RejectedExecutionException: Task java.lang.Runnable rejected from java.util.concurrent.ThreadPoolExecutor@... —— 本质是旧线程池还在接收任务,而新实例已初始化。

shutdown() 和 shutdownNow() 的关键区别

两者都用于终止线程池,但行为完全不同:

  • shutdown():平滑关闭,不再接受新任务,但会等待已提交任务(包括队列中未执行的)完成;适合常规服务停机场景
  • shutdownNow():立即尝试中断所有正在执行的线程,并返回尚未执行的任务列表;不保证任务一定被取消,尤其对忽略中断的代码无效

错误做法是只调用 shutdown() 就结束,却不等待任务真正结束——这会导致主线程退出、JVM终止,而工作线程仍在后台运行(尤其当使用 Executors.newFixedThreadPool() 这类默认创建非守护线程的工厂时)。

必须配合 awaitTermination() 的典型模式

仅调用 shutdown()shutdownNow() 不足以确保资源释放。正确做法是:

WowTo
WowTo

用AI建立视频知识库

下载

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

  • 先调用 shutdown()
  • 再用 awaitTermination(long timeout, TimeUnit unit) 等待指定时间
  • 超时后若仍为 !isTerminated(),可考虑记录告警或强制 shutdownNow()

示例片段:

executor.shutdown();
try {
    if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
        executor.shutdownNow();
        if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
            System.err.println("线程池未能正常终止");
        }
    }
} catch (InterruptedException e) {
    executor.shutdownNow();
    Thread.currentThread().interrupt();
}

使用 try-with-resources 或 Spring 生命周期管理更可靠

手动调用关闭逻辑容易遗漏(比如异常提前跳出)。更稳妥的方式:

  • 自定义线程池包装类实现 AutoCloseable,在 close() 中执行完整关闭流程
  • 在Spring环境中,优先使用 @Bean(destroyMethod = "shutdown") 声明线程池,由容器托管生命周期
  • 避免在工具类中用静态 ExecutorService,除非明确设计为全局长周期使用且有统一关闭入口

特别注意:Executors.newCachedThreadPool() 创建的线程默认60秒空闲后销毁,看似“自动回收”,但若任务持续提交,线程数可能无限增长;且其线程仍是非守护线程,JVM退出前仍需显式关闭。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

146

2025.08.06

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

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

83

2026.01.26

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

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

721

2023.08.10

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

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

721

2023.08.10

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

0

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

0

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

0

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

50

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

4

2026.02.27

热门下载

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

精品课程

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

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.3万人学习

Java 教程
Java 教程

共578课时 | 73.5万人学习

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

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