天天看點

關于java中定時器的實作 三種方式

最近需要寫個小程式,實作定時将記事本中的資料導入到資料庫,這個小程式大緻可以分為三個子產品,讀取檔案内容,解析檔案内容(封裝成對象集合),插入資料庫(自己寫的一個工具類,傳入資料對象集合、表名即可)。

對定時任務這塊,因為隻是個小程式,不想引用第三方的定時任務 quartz, 找了下其他的實作,總結了下。 java中實作定時任務至少有三種方式。

1.自己寫while(true)死循環,來判斷是否到達執行時間條件

這種實作定時任務的方式,完全是自己寫代碼實作,放在第一個介紹,是因為它最靈活,完全由自己控制,但是缺點是,隻适合小工具類的程式,任務單一固定的程式。 實作的簡單代碼塊如下:

long  interval = 100;   // 秒 String runTime = "12:50";

Date startTime = new Date();      
boolean runFlag = false;      
int count = 0;      

while(true){

Date nowTime = new Date();      
if (!StringUtils.isEmpty(runTime)) {      
String checkTime = DateUtilsExt.getNowTime("HH:mm");      
if (runTime.equals(checkTime)) {      
runFlag = true;      
}      
} else if (intervalTime > 0) {      
long now = nowTime.getTime();      
long start = startTime.getTime();      
long interval = (now - start)/1000;      
//第一次執行      
if (count == 0) {      
runFlag = true;      
//間隔時間執行  運作間隔到了指定秒以後執行      
} else if (intervalTime <= interval){      
runFlag = true;      
}      
}      
if (runFlag) {      
// 執行定時任務
}      

}

2.java自帶的工具類 timer + timerTask

這個方式是我們本次導數工具所用的程式。用着挺友善,timer ,timerTask 都是java.util中提供的工具類, 既可以用于java web項目,也可以用于javase項目。實,現代碼如下 1.具體任務類

public class DateImportTask extends TimerTask {

    private static Logger log = Logger.getLogger(DateImportTask.class);
    private static boolean isRunning = false;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    public void run() {
        if (!isRunning) {
            isRunning = true;
            log.info("開始執行任務..."); //開始任務

            //working  add what you want to do

            log.info("執行任務完成..."); //任務完成
            isRunning = false;
        } else {
            log.info("上一次任務執行還未結束..."); //上一次任務執行還未結束

        }
    }
}      

2.任務控制類

public class TaskManager implements ServletContextListener {

    private final Logger logger = Logger.getLogger(TaskManager.class);

    /**
     * 無延遲
     */
    public static final long NO_DELAY = 0;
    /**
     * 定時器
     */
    private Timer timer;
    /**
     * 在Web應用啟動時初始化任務
     */
    public void contextInitialized(ServletContextEvent event) {
        //定義定時器
        timer = new Timer("資料導入任務",true);

        logger.info("定時器初始化。。。");
        //啟動備份任務,每  執行一次
//        timer.schedule(new DateImportTask(),NO_DELAY, DateUtils.MILLIS_PER_SECOND * 1);

        // 設定指定時間點啟動任務
        String startHour =  event.getServletContext().getInitParameter("startHour");
        String startMinute =  event.getServletContext().getInitParameter("startMinute");
        int hour = 14;
        if (StringUtils.isNotBlank(startHour)){
            hour = Integer.parseInt(startHour);
        }
        int minute = 14;
        if (StringUtils.isNotBlank(startMinute)){
            minute = Integer.parseInt(startMinute);
        }
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY,hour);
        c.set(Calendar.MINUTE,minute);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info("設定的啟動時間為:"+sdf.format(c.getTime()));
        timer.schedule(new DateImportTask(), c.getTime() , DateUtils.MILLIS_PER_DAY * 1);

    }
    /**
     * 在Web應用結束時停止任務
     */
    public void contextDestroyed(ServletContextEvent event) {

        logger.info("定時器銷毀。。。");
        timer.cancel(); // 定時器銷毀
    }
}      

3.quartz

      Quartz是OpenSymphony開源組織的開源項目,既可以用于java web項目,也可以用于javase項目