在现代软件开发中,定时任务是一项非常重要的功能。无论是数据备份、自动化报告生成还是周期性任务,定时器都是不可或缺的工具。
在Java中,我们可以使用内置的 java.util.timer 和 java.util.TimerTimerTask 类来实现定时任务。本篇博客将详细介绍如何使用Java定时器来创建各种定时任务,并提供实例演示。
在使用Java定时器之前,我们需要了解两个基本的概念:' Timer ' 和 ' TimerTask '。
Timer类:Timer类是Java中用于执行定时任务的核心类。它可以安排任务在指定的时间开始运行,也可以按照固定的时间间隔周期性地执行任务。
TimerTask类:类是一个抽象类,它实现了 Runnable 接口。我们可以通过继承 TimeTask 类来创建自定义的定时任务。
首先,我们需要创建一个Timer
对象,并通过该对象的schedule()
方法来安排定时任务:
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
// 定时任务的具体逻辑
System.out.println("定时任务执行中...");
}
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask myTask = new MyTimerTask();
// 在延迟1秒后,每隔2秒执行一次任务
timer.schedule(myTask, 1000, 2000);
}
}
在这个例子中,MyTimerTask
类继承自TimerTask
,并实现了run()
方法,该方法中定义了定时任务的具体逻辑。在main()
方法中,我们创建了一个Timer
对象,并使用schedule()
方法安排了定时任务的执行。
1. 需要一个类,通过类对象来描述一个任务(至少包含任务内容和时间)
2. 需要一个Timer类(Timer中有一个线程,扫描任务是否到时间,可以执行了)
3. 需要有一个数据结构,把所有的任务都存起来(优先级队列)
1. 模拟实现 TimerTask
// 模拟TimerTask(定时器任务)
class MyTimerTask implements Comparable{
// 要执行的任务
private Runnable runnable;
// 执行任务的时间
private long time;
//模拟 TimerTask 函数
public MyTimerTask(Runnable runnable,long delay) {
this.runnable = runnable;
this.time = System.currentTimeMillis() + delay;
}
@Override
public int compareTo(MyTimerTask o) {
// 让队首元素是最小的元素
return (int)(this.time-o.time);
}
public Long getTime() {
return time;
}
public Runnable getRunnable() {
return runnable;
}
}
2. 模拟实现定时器
// 模拟定时器
class MyTimer {
private Object obiect = new Object();
// 使用一个数据结构,保存任务数据(优先级队列)
private PriorityQueue queue = new PriorityQueue<>();
// 实现 schedule(时间表) 函数
public void schedule(Runnable runnable, long delay) {
synchronized (obiect) {
queue.offer(new MyTimerTask(runnable, delay));
obiect.notify();
}
}
// 扫描线程
public MyTimer() {
Thread t = new Thread(() -> {
// 不停的扫描队首,观察是否到时间
while (true) {
synchronized (obiect) {
// 队列为空的时候,阻塞等待
while (queue.isEmpty()) {
try {
obiect.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
MyTimerTask task = queue.peek();
// 比较队首元素是否可以执行了
long curTime = System.currentTimeMillis();
if (curTime >= task.getTime()) {
// 达到的话开始执行任务 执行完删除
task.getRunnable().run();
queue.poll();
}else {
try {
obiect.wait(task.getTime() - curTime);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
});
t.start();
}
}
通过本篇博客,我们学习了如何使用Java的定时器来执行各种定时任务。无论是简单的周期性任务还是复杂的定时调度,Java定时器都能够满足我们的需求。希望本文能够帮助你更好地理解和使用Java定时器,提高你的编程效率。
希望这篇文章对你有所帮助!如果你有任何问题或建议,欢迎在下方留言。谢谢阅读!