定时任务

定时任务

一、TimerTimerTask

1.1 TimerTimerTask 的基本概念

  • **Timer**:用于安排和管理定时任务的类。它可以调度任务在将来的某个时间点执行,或者周期性地执行。
  • **TimerTask**:一个抽象类,表示一个可以被 Timer 调度的任务。需要继承这个类并实现 run() 方法来定义任务的具体内容。

1.2 实现步骤

  1. 创建一个 Timer 实例
  2. 创建一个继承自 TimerTask 的任务类,并实现其 run() 方法
  3. 使用 Timer 实例安排任务的执行时间和周期

1.3 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class ScheduledTasksTest {
public static void main(String[] args) throws ParseException {
// 创建定时器对象
// 如果这个定时器执行的任务是一个后台任务,是一个守护任务,建议将其定义为守护线程。
Timer timer = new Timer(true);

// 指定定时任务的开始时间和间隔
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date firstDate = sdf.parse("2024-06-23 09:05:00");

// 安排定时任务,每隔 1000 毫秒(1 秒)执行一次
timer.schedule(new LogTimeTask(), firstDate, 1000);

// 主线程继续运行,可以通过睡眠来观察定时任务的执行
try {
Thread.sleep(10000); // 主线程睡眠10秒,观察定时任务的执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

/**
* 定时任务类:专门记录日期的定时任务类。
*/
public class LogTimeTask extends TimerTask {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
int count = 0;
@Override
public void run() {
// 执行任务
Date now = new Date();
String strTime = sdf.format(now);
System.out.println(strTime+":"+(count++));
}
}

1.4 其他定时任务方法

除了 schedule(TimerTask task, Date time, long period)Timer 还有其他一些常用的调度方法:

  • schedule(TimerTask task, Date time):在指定的时间执行一次任务。
  • schedule(TimerTask task, long delay):在指定的延迟后执行一次任务。
  • scheduleAtFixedRate(TimerTask task, Date firstTime, long period):在指定的时间开始,按照固定的时间间隔执行任务。
  • scheduleAtFixedRate(TimerTask task, long delay, long period):在指定的延迟后开始,按照固定的时间间隔执行任务。