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