JAVA 定时器

定时执行任务的三种方法:
  1)java.util.Timer.
  2)ServletContextListener.
  3)org.springframework.scheduling.timer.ScheduledTimerTask
  1)java.util.Timer
  这个方法应该是最常用的,不过这个方法需要手工启动你的任务:
  Timer timer=new Timer();
  timer.schedule(new ListByDayTimerTask(),10000,86400000);
  这里的ListByDayTimerTask类必须extends TimerTask里面的run()方法。
  2)ServletContextListener
  这个方法在web容器环境比较方便,这样,在web server启动后就可以
  自动运行该任务,不需要手工操作。
  将ListByDayListener implements ServletContextListener接口,在
  contextInitialized方法中加入启动Timer的代码,在contextDestroyed
  方法中加入cancel该Timer的代码;然后在web.xml中,加入listener:
  
  com.sysnet.demo.util.MyTimerTask
  
  3)org.springframework.scheduling.timer.ScheduledTimerTask
  如果你用spring,那么你不需要写Timer类了,在schedulingContext-timer
  .xml中加入下面的内容就可以了:
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  10000
  
  
  86400000
  
  
  
  下面给出方法2的一个例子供大家参考:
  Java代码:
  import java.util.Timer;
  import javax.servlet.ServletContextEvent;
  import javax.servlet.ServletContextListener;
  public class MyTimerTask implements ServletContextListener{
  private Timer timer = null;
  @Override
  public void contextDestroyed(ServletContextEvent event) {
  // TODO Auto-generated method stub
  timer.cancel();
  event.getServletContext().log("定时器销毁");
  System.out.println("停止备份程序……");
  }
  @Override
  public void contextInitialized(ServletContextEvent event) {
  //在这里初始化监听器,在tomcat启动的时候监听器启动,考试,大提示可以在这里实现定时器功能
  timer = new Timer(true);
  event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到
  timer.schedule(new exportHistoryBean(event.getServletContext()),0,5*1000);//调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
  }
  }
  import java.util.Calendar;
  import java.util.TimerTask;
  import javax.servlet.ServletContext;
  public class exportHistoryBean extends TimerTask
  {
  private static final int C_SCHEDULE_HOUR = 0;
  private static boolean isRunning = false;
  private ServletContext context = null;
  public exportHistoryBean(ServletContext context)
  {
  this.context = context;
  }
  @Override
  public void run()
  {
  Calendar c = Calendar.getInstance();
  if(!isRunning)
  {
  if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY))
  {
  isRunning = true;
  context.log("开始执行指定任务");
  isRunning = false;
  context.log("指定任务执行结束");
  }
  else
  {
  context.log("上一次任务执行还未结束");
  }
  }
  }
  }
  web.xml里加入一下代码:
  
  com.sysnet.demo.util.MyTimerTask
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章