Java 计时器 TimerTask 示例
Java java.util.Timer是一个实用程序类,可用于安排线程在未来某个时间执行。Java Timer类可用于安排任务一次性运行或定期运行。
Java 定时器任务
java.util.TimerTask是一个实现 Runnable 接口的抽象类,我们需要扩展这个类来创建我们自己的可以使用java Timer类进行调度的TimerTask。
Java 计时器示例
Java Timer 类是线程安全的,多个线程可以共享一个Timer对象,而无需外部同步。Timer 类使用java.util.TaskQueue以给定的固定间隔添加任务,并且任何时候都只能有一个线程运行 TimerTask,例如,如果您创建一个每 10 秒运行一次的 Timer,但单线程执行需要 20 秒,则 Timer 对象将继续将任务添加到队列中,并且一旦一个线程完成,它将通知队列,另一个线程将开始执行。Java Timer 类使用 Object wait 和 notify方法来安排任务。这是一个 Java Timer 和 TimerTask 示例的简单程序。
package com.journaldev.threads;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
}
private void completeTask() {
try {
//assuming it takes 20 secs to complete the task
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//running timer task as daemon thread
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//cancel after sometime
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
请注意,一个线程执行将花费 20 秒,但 Java Timer 对象计划每 10 秒运行一次任务。以下是程序的输出:
TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012
输出确认,如果任务已在执行,Timer 将等待它完成,一旦完成,它将再次从队列中启动下一个任务。可以创建 Java Timer 对象以将相关任务作为守护线程运行。Timer cancel()方法用于终止计时器并放弃任何计划的任务,但它不会干扰当前正在执行的任务并让其完成。如果计时器作为守护线程运行,无论我们是否取消它,它都会在所有用户线程执行完成后立即终止。Timer 类包含几个schedule () 方法,用于安排任务在给定日期或延迟后运行一次。有几种scheduleAtFixedRate () 方法可以以一定间隔定期运行任务。在使用 Timer 调度任务时,您应该确保时间间隔大于正常线程执行,否则任务队列大小将不断增长,最终任务将始终执行。以上就是对 Java Timer 和 Java TimerTask 的快速总结。