0

0

在Java里Timer和TimerTask如何实现定时任务_Java定时任务工具说明

P粉602998670

P粉602998670

发布时间:2026-02-08 12:22:25

|

664人浏览过

|

来源于php中文网

原创

Timer 不推荐使用,因其单线程设计导致未捕获异常时整个调度器崩溃;schedule 基于上一次执行完成时间顺延,scheduleAtFixedRate 基于初始预定时间严格推进;应改用 ScheduledExecutorService。

在java里timer和timertask如何实现定时任务_java定时任务工具说明

Java 里 TimerTimerTask 能实现基础定时任务,但不推荐在新项目中使用——它线程不安全、无法处理异常导致后续任务全部停摆、也不支持并发执行。

为什么 Timer 容易“一崩全停”

一个 Timer 实例背后只有一条后台线程(TimerThread),所有 TimerTask 都由它串行执行。一旦某个 TimerTaskrun() 方法抛出未捕获异常,该线程会立即终止,之后注册的所有任务永远不会再触发。

  • 常见错误现象:Timer 突然“静默失效”,控制台无报错,但任务不再执行
  • 典型场景:网络请求失败没 try-catch、JSON 解析异常、数据库连接中断
  • 无法恢复:线程挂了就挂了,没有重试或重启机制

schedule()scheduleAtFixedRate() 的关键区别

两者都用于周期性调度,但对“延迟”和“执行节奏”的处理逻辑完全不同:

  • schedule(task, delay, period):以“上一次实际执行完成时间”为基准,延迟 period 后再启动下一次;若某次执行超时,下一次会自动顺延,不会堆积
  • scheduleAtFixedRate(task, firstTime, period):以“预定起始时间”为基准,严格按 period 间隔推进;若某次执行耗时过长,后续任务可能被压缩甚至并发触发(但 Timer 是单线程,所以实际是立即排队)
  • 性能影响:后者更容易因任务延迟引发队列积压,最终 OutOfMemoryError: Java heap space(大量未执行的 TimerTask 对象滞留在队列中)

如何避免 TimerTask 泄漏和资源未释放

TimerTask 是抽象类,子类常持有外部对象引用(如 Service、DAO、Context),若忘记取消或 Timer 未被回收,会导致 GC 无法清理,引发内存泄漏。

SciMaster
SciMaster

全球首个通用型科研AI智能体

下载

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

  • 必须显式调用 timer.cancel() —— 这会清空任务队列并终止线程,但不能重复调用
  • timerTask.cancel() 只是从队列中移除该任务,不影响其他任务,也不终止线程
  • 常见疏漏:Spring Bean 中用 @PostConstruct 启动 Timer,却没在 @PreDestroy 中调用 cancel()
  • 建议封装:把 Timer 和关键 TimerTask 绑定在一个管理类里,提供统一启停接口

替代方案比你想象中更简单

除非维护老系统,否则直接用 ScheduledExecutorService

  • 线程池可配置大小,天然支持并发执行多个任务
  • 异常不会中断整个调度器,只会终止当前任务实例
  • API 更清晰:scheduleAtFixedRate() / scheduleWithFixedDelay() 命名即语义
  • 示例:
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
    scheduler.scheduleAtFixedRate(() -> {
        // 你的逻辑
    }, 0, 5, TimeUnit.SECONDS);

真正复杂的是任务持久化、故障恢复、分布式协调——这些 TimerScheduledExecutorService 都不解决,得靠 Quartz 或 XXL-JOB 这类调度中间件。别在基础定时器上硬扛业务可靠性需求。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

118

2025.08.06

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

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

73

2026.01.26

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

379

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

239

2023.10.07

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

180

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

222

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

431

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

542

2023.08.23

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.02.06

热门下载

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

精品课程

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

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.9万人学习

Java 教程
Java 教程

共578课时 | 60.2万人学习

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

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