Timer 是jdk 自身提供的定时器, 可使用于实现一些简单的定时任务,如在某一时刻执行一次任务或以固定时间间隔执行任务. 一个Timer 实例可调度多个TimerTask, 底层使用队列(TaskQueue)存储, 不能并发启动定时任务. 因此, 对于复杂的定时任务, 笔者推荐使用quartz.
1. Timer 常用API
默认情况下,Timer 创建的线程为用户线程, 如果想让其为守护进程的话, 创建时需要设置isDaemon 为true.
方法签名 | 方法描述 |
---|---|
public Timer(String name) | 构造方法, 创建定时器, 并指定线程名称. 以定时调度线程为用户线程 |
public Timer(boolean isDaemon) | 构造方法, 创建定时器, isDaemon 设置为trues时表示以守护线程执行 |
public Timer(String name, boolean isDaemon) | |
public void schedule(TimerTask task, long delay) | 只调度一次, 延迟delay毫秒之后执行 |
public void schedule(TimerTask task, Date time) | 只调度一次, 在具体时刻time 执行 |
public void schedule(TimerTask task, long delay, long period) | 循环调度, 在delay毫秒之后开始,每隔period毫秒执行一次 |
public void schedule(TimerTask task, Date firstTime, long period) | 循环调度, 在时刻firstTime开始调度, 每隔period毫秒执行一次 |
public void scheduleAtFixedRate(TimerTask task, long delay, long period) | 和schedule方法类似, 只是错过的任务会被继续执行 |
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) | 和schedule方法类似, 只是错过的任务会被继续执行 |
public int purge() | 清理所有已取消状态的TimerTask |
public void cancel() | 取消所有调度 |
2. 调度测试
2.1 延时调度一次
程序启动3秒之后, 执行一次
public static void main(String[] args) throws InterruptedException {
// 创建定时器
Timer timer = new Timer("myTimer");
// 创建定时任务
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println(LocalDateTime.now() + "-hello");
}
};
// 添加调度
timer.schedule(timerTask ,3000);
}
2.2 定时调度一次
定时任务在下一分钟00秒时执行一次
public static void main(String[] args) throws InterruptedException {
// 创建定时器
Timer timer = new Timer("myTimer");