java怎么实现定时任务 使用Timer或ScheduledExecutor实现定时执行
技术百科
畫卷琴夢
发布时间:2025-11-29
浏览: 次 推荐使用ScheduledExecutorService实现定时任务,因其支持多线程、异常隔离和更精确调度,而Timer单线程且异常会终止全部任务,存在缺陷。
在Java中实现定时任务,常用的方式有两种:使用 Timer 类和使用 ScheduledExecutorService。虽然两者都能完成定时或周期性任务的调度,但推荐使用 ScheduledExecutorService,因为它更健壮、更灵活,且线程安全性更好。
1. 使用 Timer 实现定时任务
Timer 是 Java 早期提供的定时器工具,通过一个后台线程按计划执行任务。它适合简单的定时场景,但存在一些局限性(如异常会终止整个定时器)。
示例:每隔2秒执行一次任务
import java.util.Timer;
import java.util.TimerTask;
public class TimerExample {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("执行定时任务: " + System.currentTimeMillis());
}
};
// 延迟1秒后开始,每隔2秒执行一次
timer.schedule(task, 1000, 2000);
}
}
注意:如果 TimerTask 中抛出未捕获的异常,整个 Timer 的后续任务都会停止,这是其主要缺陷。
2. 使用 ScheduledExecutorService 实现定时任务
ScheduledExecutorService 是 java.util.concurrent 包中的接口,比 Timer 更强大,支持多线程调度、异常隔离、更精确的时间控制等。
示例:延迟1秒后,每隔2秒执行一次
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorExample {
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
Runnable task = () -> System.out.println("执行任务: " + System.currentTimeMillis());
// 延迟1秒后开始,每隔2秒执行一次
sche
duler.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
}
}
常用方法说明:
- schedule(Runnable command, long delay, TimeUnit unit):延迟执行一次
- scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):固定频率执行,从任务开始计时
- scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit):固定延迟执行,从上一次结束开始计时
3. Timer 和 ScheduledExecutorService 对比
| 特性 | Timer | ScheduledExecutorService |
|---|---|---|
| 线程模型 | 单线程 | 可配置多线程 |
| 异常处理 | 一个任务异常会导致其他任务失效 | 任务间隔离,异常不影响其他任务 |
| 精度与性能 | 一般 | 更高,适合复杂调度 |
| 推荐程度 | 不推荐用于生产环境 | 推荐,是现代Java应用首选 |
4. 实际使用建议
在实际开发中,特别是Spring等框架中,更多使用 @Scheduled 注解来实现定时任务,底层通常基于 ScheduledExecutorService 或 Quartz。
但如果需要手动控制线程池或调度逻辑,直接使用 ScheduledExecutorService 更加灵活可靠。
基本上就这些,ScheduledExecutorService 更安全、更强大,应优先选择。Timer 只适合学习或非常简单的场景。
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- XML的“混合内容”是什么 怎么用DTD或XSD定
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- php增删改查需要哪些扩展_开启mysqli或pd
- Go 语言标准库为何不提供泛型 Contains
- Win10如何优化内存使用_Win10内存优化技巧
- c++ stringstream用法详解_c++字
- Win11资源管理器卡顿怎么办 Win11文件资源
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- 如何使用Golang编写单元测试_创建Test函数
- Windows怎样拦截WPS弹窗广告_Window
- Win10怎样卸载DockerDesktop_Wi
- 如何在Golang中解压文件_Golang com
- Windows10系统服务优化指南_Win10禁用
- php订单日志怎么导出excel_php导出订单日
- Windows10蓝屏SYSTEM_SERVICE
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- Win11怎么设置任务栏图标大小_Windows1
- c++中如何使用auto关键字_c++11类型推导
- php怎么连接数据库_MySQL数据库连接的基础代
- Mac电脑进水了怎么办_MacBook进水后紧急处
- php8.4如何调用com组件_php8.4win
- 如何在Windows上设置闹钟和计时器_系统自带的
- Win11怎么设置默认终端应用_Windows11
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- php本地部署后数据库连接报错_1045acces
- 如何高效识别并拦截拼接式恶意域名 spam
- Mac上的iMovie如何剪辑视频?(新手入门教程
- 短链接怎么用php还原_从基础原理到代码实现教学【
- c++中如何求一个数的平方根_c++ sqrt函数
- Django密码修改后会话失效的解决方案
- Win11怎么恢复误删照片_Win11数据恢复工具
- PythonPandas数据分析教程_数据清洗与处
- 跨文件调用类方法怎么用_php作用域操作符与自动加
- 如何在 Go 中正确反序列化多个同级 XML 元素
- LINUX如何删除用户和用户组_Linux use
- Win11如何设置计划任务 Win11定时执行程序
- Win11怎么设置默认邮件客户端 Win11修改M
- Windows如何使用注册表查找和删除项?(reg
- Win11如何设置系统语言_Win11系统语言切换
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- 如何使用Golang实现聊天室消息存档_存储聊天记
- 如何在Golang中修改数组元素_通过指针实现原地
- Win11怎么设置桌面图标间距_Windows11
- Win11怎样安装剪映专业版_Win11安装剪映教
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Python并发安全问题_资源竞争说明【指导】
- Windows 11怎么设置默认解压软件_Wind
- Windows 10自带杀毒软件在哪_Window
- Win11摄像头无法使用怎么办_Win11相机隐私

duler.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
}
}
QQ客服