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(); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- test1包 --> <listener> <listener-class>com.weiyuanit.test1.MyListener</listener-class> </listener> </web-app>
能够去下载:java定时任务小例子java