Java java.util.Timer
是一个实用程序类,可用于调度将来某个时间执行的线程。Timer
类可用于计划要一次运行的任务或定期运行的任务。
Java TimerTask类
java.util.TimerTask
是一个实现Runnable
接口的抽象类,需要扩展这个类来创建自己的TimerTask
,它可以使用Timer
类进行调度。
Java Timer
类是线程安全的,多个线程可以共享一个Timer
对象,而无需外部同步。Timer
类使用java.util.TaskQueue
以给定的固定间隔添加任务,并且在任何时候只有一个线程运行TimerTask
,例如,如果创建一个Timer
每10秒运行一次,但单线程执行需要20秒, 然后Timer
对象将继续向队列添加任务,当一个线程完成,它将通知队列,另一个线程将开始执行。
Java Timer
类使用Objectwait
和notify
方法来安排任务。
这是一个简单的Java Timer
和TimerTask
示例程序。
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 2020
Timer task finished at:Wed Dec 26 19:16:59 PST 2020
Timer task started at:Wed Dec 26 19:16:59 PST 2020
Timer task finished at:Wed Dec 26 19:17:19 PST 2020
Timer task started at:Wed Dec 26 19:17:19 PST 2020
Timer task finished at:Wed Dec 26 19:17:39 PST 2020
Timer task started at:Wed Dec 26 19:17:39 PST 2020
Timer task finished at:Wed Dec 26 19:17:59 PST 2020
Timer task started at:Wed Dec 26 19:17:59 PST 2020
Timer task finished at:Wed Dec 26 19:18:19 PST 2020
Timer task started at:Wed Dec 26 19:18:19 PST 2020
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2020
输出确认如果任务已经执行,Timer
将等待它完成,一旦完成,它将再次从队列开始下一个任务。
可以创建Java Timer
对象以将相关任务作为守护程序线程运行。Timer
类的cancel()
方法用于终止计时器并丢弃任何计划任务,但它不会干扰当前正在执行的任务并让它完成。如果计时器作为守护程序线程运行,无论我们是否取消它,它将在所有用户线程完成执行后立即终止。
Timer
类包含几个schedule()
方法,用于安排任务在给定日期或延迟一段时间后运行一次。有几个scheduleAtFixedRate()
方法以一定的间隔定期运行任务。
在使用Timer
调度任务时,应该确保时间间隔超过正常的线程执行,否则任务队列大小将继续增长,最终任务将始终执行。