1. 程式人生 > >定時在00:00:00執行任務

定時在00:00:00執行任務

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class HandleTimerTask implements ServletContextListener {

 private Timer timer = null;      //定時器
 private static int DOWNlOAD_HOUR = 0;    //執行任務開始時間(時)
 private static int DOWNlOAD_MINUTE = 0;   //執行任務開始時間(分)
 private static int DOWNlOAD_SECOND = 0;   //執行任務開始時間(秒)
 private long delay;        //延時時間值(當前系統時間到下載時間之間的時間差毫秒數)
 
 public void contextInitialized(ServletContextEvent event) {
  init();//初始化引數
  timer = new Timer(true);//建立Timer物件
  //定時執行程式
  timer.schedule(new Handle(event.getServletContext()),delay,24*60*60*1000);//呼叫Handle()類(即每天要執行的任務),delay表示延遲毫秒數,0,24*60*60*1000表示每隔一天執行一次任務,60*60*1000表示一個小時;
 }

 public void contextDestroyed(ServletContextEvent event) {
  timer.cancel();
 }
 
 /**
  * 初始化引數
  * @return
  */
 public void init(){
  //宣告一個Calendar物件
  Calendar cal = Calendar.getInstance();
  //設定時間
        cal.set(Calendar.HOUR_OF_DAY, DOWNlOAD_HOUR);
        cal.set(Calendar.MINUTE, DOWNlOAD_MINUTE);
        cal.set(Calendar.SECOND, DOWNlOAD_SECOND);
        Date date = new Date();
        //獲取設定的時間
        date = cal.getTime();
        //聲明當前時間
        Date now = new Date();
        //獲取設定的時間和當前的時間差(毫秒數)
        long interval = date.getTime() - now.getTime();
        //如果當前時間大於下載時間,則將下載時間設定為下一個下載時間
        if (interval < 0) {
            cal.add(Calendar.DAY_OF_MONTH, 1);//將天數加1
            date = cal.getTime();
            //獲取設定的時間和當前的時間差(毫秒數)
            interval = date.getTime() - now.getTime();
        }      
        this.startTime = date;//初始化開始下載時間
        this.delay = interval;//初始化當前時間到下載時間之間的時間差
 }
}


public class Handle extends TimerTask {

 private ServletContext context = null;
 Timer timer = null;      //查詢任務定時器
 
 public Handle(ServletContext context)
 {
  this.context = context;
 }

 /**
  * 開始執行
  */
 public void run() {
  //開始執行
        context.log("開始執行!");
 }
}


用延遲時間可以實現,添加了一個init()方法用來計算延時數,不管什麼時候啟動服務,都可以根據當前系統時間和執行任務的開始時間計算出延時時間毫秒數。