Java Timer类实现定时任务详解
137 浏览量
更新于2024-09-01
收藏 87KB PDF 举报
"Java定时任务的实现主要依赖于`java.util.Timer`类和`java.util.TimerTask`类。本文将详细介绍如何使用这两个类来创建定时执行的任务。"
在Java编程中,有时候我们需要按照预设的时间间隔执行特定的任务,例如定时发送邮件、数据备份或定期检查更新等。这时,我们可以使用`java.util.Timer`类和它的配套类`java.util.TimerTask`来实现这一功能。`Timer`类是一个调度线程,它按照预定的时间表执行`TimerTask`对象。`TimerTask`是一个抽象类,需要我们创建其子类并重写`run`方法来定义具体要执行的任务。
首先,我们来看一个简单的例子,展示如何使用`Timer`和`TimerTask`来每隔一段时间执行一次任务:
```java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo {
public static String getCurrentTime() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("main start: " + getCurrentTime());
startTimer();
Thread.sleep(1000 * 5); // 休眠5秒
System.out.println("main end: " + getCurrentTime());
}
public static void startTimer() {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("task run: " + getCurrentTime());
}
};
Timer timer = new Timer();
timer.schedule(task, 0);
}
}
```
在这个例子中,我们创建了一个`TimerTask`子类的匿名内部类,重写了`run`方法,该方法将在定时器触发时执行。`startTimer`方法创建了一个`Timer`实例,并使用`schedule`方法安排任务立即开始执行(参数为0表示立即执行)。`main`方法中的`Thread.sleep`是为了让主线程暂停,以便我们观察任务的执行情况。
`Timer`类的`schedule`方法有两个版本,一个接受`delay`参数,表示延迟多久后开始执行;另一个接受`delay`和`period`参数,表示延迟多久后开始执行以及之后每隔多久执行一次。例如,如果我们希望任务每隔3秒执行一次,可以这样调用`schedule`:
```java
timer.schedule(task, 0, 3000); // 延迟0秒后开始,然后每隔3秒执行一次
```
此外,`Timer`类还提供了取消任务和取消整个定时器的方法。`TimerTask`的`cancel`方法用于取消单个任务的执行,而`Timer`的`cancel`方法则会取消所有排队的任务,但已开始的任务不会受到影响。
需要注意的是,`Timer`类使用单个后台线程来调度任务,因此多个任务的执行顺序是不确定的。如果一个任务执行时间过长,可能会阻塞其他任务的执行。在高并发或者对任务执行顺序有严格要求的场景下,可能需要考虑使用其他更高级的定时框架,如`ScheduledExecutorService`。
总结来说,`java.util.Timer`和`java.util.TimerTask`是Java标准库中基础的定时任务工具,适合简单定时需求。但对于复杂的定时任务调度,开发者可以考虑使用`java.util.concurrent`包下的`ScheduledExecutorService`,它提供了更多控制和灵活性。
2020-12-22 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38577922
- 粉丝: 10
- 资源: 962
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库