在应用开发中,经常需要一些周期性的操作,此时需要用到java.util.Timer。
Timer是JDK中的定时调度类,主要用来定时触发任务:
Timer是调度控制器,TimerTask是可调度的任务:
public static void main(String[] args)
{
Timer timer = new Timer();
//timer.scheduleAtFixedRate(new PlainTimerTask(), new Date(), 3000);
timer.scheduleAtFixedRate(new PlainTimerTask(), 2000, 5000);
}
private static class PlainTimerTask extends TimerTask
{
@Override
public void run()
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(format.format(Calendar.getInstance().getTime()));
}
}
任务类需要继承 TimerTask类。
timer.schedule(task,date,second) date表示什么时候执行,second表示每隔多少秒再执行。有4个重载方法。
其基本处理模型是单线程调度的任务队列模型,Timer不停地接受调度任务,所有任务接受Timer调度后加入TaskQueue,TimerThread不停地去TaskQueue中取任务来执行.
从图上不难看出,这就是生产者--消费者模型的一种特例:多生产者,单消费者模型。
此种消息队列实现方式在浏览器中的编程模型中也有类似的实现,javascript中的定时执行函数setTimeout(expression,milliseconds)也是基于此种原理实现的。
Timer中仅有一个存储Task的Queue和一个调度所有Task的线程。不管你schedule几次,在Timer上加了几个Task,都只有一个后台的线程进行调度。