0

0

如何使用Java的Timer和TimerTask实现定时器_简单任务调度实现

P粉602998670

P粉602998670

发布时间:2026-03-03 08:49:15

|

360人浏览过

|

来源于php中文网

原创

如何使用java的timer和timertask实现定时器_简单任务调度实现

Timer 和 TimerTask 为什么容易漏掉 cancel() 导致内存泄漏

Java 的 Timer 是单线程调度器,所有 TimerTask 都在同一个后台线程执行;一旦任务没显式取消,Timer 实例会一直持有对任务的强引用,哪怕外部对象已不可达。JVM 不会回收它,后台线程持续运行,形成隐式内存泄漏。

常见错误现象:OutOfMemoryError: unable to create new native thread,尤其在频繁创建新 Timer 的 Web 应用中(比如每次 HTTP 请求都 new 一个)。

  • 必须在任务完成或不再需要时调用 timer.cancel(),且建议紧接着置 timer = null
  • timer.purge() 只清理已取消但未执行的任务队列,不能替代 cancel()
  • 若任务本身是匿名内部类或 Lambda,还可能隐式持有所在类的引用——别让定时器成为 Activity/Servlet 的“吊命线”

schedule() vs scheduleAtFixedRate() 的执行逻辑差异

两者都接受延迟和周期参数,但对“执行偏差”的处理完全不同:前者按“上一次实际结束时间 + 周期”计算下次触发点,后者严格按“上一次计划开始时间 + 周期”推进,不考虑执行耗时。

使用场景举例:做心跳上报适合 scheduleAtFixedRate()(保证服务端看到等间隔信号);而日志轮转适合 schedule()(避免前次压缩未完成就启动下一轮)。

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

Mokker AI
Mokker AI

AI产品图添加背景

下载
  • 如果某次任务执行超时,scheduleAtFixedRate() 可能连续触发多次(“追赶模式”),甚至堆积线程阻塞
  • schedule() 则会跳过错过的执行点,只保障“不早于计划时间”,更保守
  • 两个方法都不支持任务失败重试、动态调整周期等高级行为——真有这类需求,直接换 ScheduledThreadPoolExecutor

TimerTask 的 run() 方法里抛异常会导致整个 Timer 停摆

Timer 后台线程遇到未捕获异常会直接终止,后续所有已调度但未执行的任务全部丢失,且不会报错日志(除非你重写了 Thread.setDefaultUncaughtExceptionHandler)。

典型错误现象:定时任务某天突然不跑了,查日志没有任何异常记录,只有 JVM 进程里少了一个 Timer-0 线程。

  • 务必在 run() 方法最外层加 try-catch(Throwable),至少打日志
  • 不要依赖 finally 做关键清理——线程一崩,finally 就不执行了
  • 若需保证任务失败后仍继续调度,得自己在 catch 里重新 timer.schedule(...),但注意别造成重复调度

Android 或 Servlet 环境下直接用 Timer 很危险

Android 的 Activity 销毁、Servlet 的 Context 关闭,都不自动清理你手动创建的 Timer;后台线程继续跑,试图更新已销毁的 UI 或访问已关闭的数据库连接,结果就是 NullPointerExceptionIllegalStateException

兼容性影响:从 Java 5 开始,Timer 就被标记为“仅适用于简单场景”,官方文档明确建议生产环境优先用 ScheduledThreadPoolExecutor

  • Android 中应改用 Handler.postDelayed()(主线程)或 Executors.newScheduledThreadPool()(后台)
  • Web 应用推荐用 Quartz 或 Spring 的 @Scheduled,它们内置生命周期管理
  • 哪怕只是写个本地工具脚本,也建议用 java.util.concurrent.ScheduledExecutorService —— 它的 shutdown() 更可控,支持多线程并发执行任务

Timer 的设计初衷就是轻量、简单、一次性;把它当长期驻留的调度中枢用,等于把自行车当卡车开——不是跑不动,是出事前你根本不知道哪根辐条快断了。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

149

2025.08.06

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

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

87

2026.01.26

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

390

2023.08.08

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

251

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

967

2024.03.01

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

60

2026.01.05

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

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

精品课程

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

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 75.4万人学习

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

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