Java Timer TimerTask示例
Java java.util.Timer是一个实用程序类,可用于安排将来某个特定时间执行的线程。
Java Timer类可用于安排任务一次运行或者定期运行。
Java TimerTask
java.util.TimerTask是实现Runnable接口的抽象类,我们需要扩展此类以创建可以使用java Timer类进行调度的自己的TimerTask。
Java计时器示例
Java Timer类是线程安全的,并且多个线程可以共享一个Timer对象,而无需外部同步。
Timer类使用java.util.TaskQueue在给定的固定间隔内添加任务,并且在任何时候都只能有一个线程运行TimerTask,例如,如果要创建一个每10秒运行一次的Timer,但单线程执行需要20秒,然后,Timer对象将继续向队列中添加任务,并且一旦一个线程完成,它将通知队列,而另一个线程将开始执行。
Java Timer类使用对象等待和通知方法来计划任务。
这是Java Timer和TimerTask示例的简单程序。
package com.theitroad.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()方法用于终止计时器并丢弃所有计划的任务,但是它不会干扰当前正在执行的任务并使其完成。
如果计时器作为守护程序线程运行,则无论我们是否取消它,它都会在所有用户线程完成执行后立即终止。
计时器类包含几个schedule()方法,以安排任务在给定日期或者延迟一段时间后运行一次。
有几种scheduleAtFixedRate()方法可按一定间隔定期运行任务。
使用Timer计划任务时,应确保时间间隔大于正常线程执行的时间,否则任务队列大小将不断增长,最终任务将始终执行。