Java定時任務的簡單實現

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

相關文章
相關標籤/搜索