package com.weiyuanit.test1;import java.util.Date;import java.util.TimerTask;/*********************** * @author:han * @version:1.0 * @created:2013-11-20 *********************** */public class MyTask extends TimerTask { @Override public void run() { //此处添加具体任务代码 try { System.out.println(" =============== call at :" + (new Date())); } catch (Exception e) { System.out.println("-------------解析信息发生异常--------------"); e.printStackTrace(); } }}
package com.weiyuanit.test1;import java.util.Calendar;import java.util.Date;import java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;/*********************** * 定时任务测试 * @author:han * @version:1.0 * @created:2013-11-20 *********************** */public class MyListener implements ServletContextListener{ private Timer timer = null; //时间间隔 private static final long PERSIOD_DAY = 24 * 60 * 60 * 1000; public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub timer.cancel(); } public void contextInitialized(ServletContextEvent sce) { timer = new Timer(true); //设置任务计划,启动和间隔时间 //timer.schedule(new MyTask(),0, 86400000); MyTask myTask = new MyTask(); //1.立刻开始执行myTask的任务,只执行一次// timer.schedule(myTask, new Date()); //2.立刻开始执行myTask的任务,执行完本次任务,隔3秒再执行一次// timer.schedule(myTask, new Date(),3000); //3.5秒钟后开始执行myTask的任务,只执行一次// timer.schedule(myTask, 5000); //4.5秒钟后开始执行myTask的任务,执行完本次任务后,隔3秒再执行一次// timer.schedule(myTask, 5000,3000); //5.立刻开始执行myTask任务,每隔3秒再执行一次// timer.scheduleAtFixedRate(myTask, new Date(), 3000); //6.秒钟后开始执行myTask任务,每隔3秒执行一次// timer.schedule(myTask, 5000,3000); /** * 需要注意的是scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果是不同的。 * 上面例子中任务只是打印一个字符串,比较简单。 * 但如果任务比较复杂,或者由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行, * 则scheduleAtFixedRate方法将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”; * 而schedule方法的后续执行也将被延迟。 * 所以,在长期运行中,scheduleAtFixedRate执行的频率将正好是指定周期的倒数,schedule 执行的频率一般要稍慢于指定周期的倒数。 另外,TimerTask的构造函数是protected,所以无法再类中直接new一个TimerTask,而只能写一个类继承TimerTask。 */ /* try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(" 1 "); //timer.cancel();//结束任务执行,程序并不终止 System.out.println(" 2 ");*/ //7.定制每日夜里2:00执行方法 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 14); calendar.set(Calendar.MINUTE, 24); calendar.set(Calendar.SECOND, 0); //第一次执行定时任务的时间 Date date = calendar.getTime(); /** * 如果第一次执行定时任务的时间 小于 当前的时间, * 此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。 * 如果不加一天,任务会立即执行 */ if (date.before(new Date())) { date = this.addDate(date, 1); } //timer.schedule(myTask, date,PERSIOD_DAY); timer.schedule(myTask, date,5000); /** * 注意事项: * 一定要注意时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后发布程序 * 或是重启过服务。那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点再执行。 * 为了避免这种情况发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间, * 就在此基础上加一天。 */ } /** * 增加或减少天数 * ******************* * @author: han * 2013-11-21 * ******************* * @param date * @param num * @return */ public Date addDate(Date date,int num) { Calendar startDate = Calendar.getInstance(); startDate.setTime(date); startDate.add(Calendar.DAY_OF_MONTH, num); return startDate.getTime(); } }
index.jsp com.weiyuanit.test1.MyListener
可以去下载:java定时任务小例子