手寫 java定時器功能實例(一)

java工具類中可以使用定時器功能。假設我們要設置一個週期定時任務,或者日期定時任務可以使用

Timer timer = new Timer();
timer.scheduleAtFixedRate(task, delay, period);

task是業務邏輯,只要根據自己的需求寫需要幹什麼就可以了,delay是第一次執行定時器的時機,period是循環執行定時器的時機,單位都是毫秒。

這個最複雜的就是你第一次執行的時間是多少了,所以需要自己寫一些方法去實現。下面我的思路捋一下,就是在數據庫中或者配置文件中保存類似“4  08:16:10”這樣子的信息,

4代表星期 後面就代表執行的具體時間了,然後去獲取,截取星期和具體時間,計算第一次的執行時機。

代碼如下:

/***
 * @author ZHanG
 *這個類主要就是將設置週期定時器的第一個時間的毫秒值的計算
 *        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, delay, period);
        設置的參數爲delay
 */
public class WeekMsec {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        //輸入星期,可以從數據庫獲取
        int weekDay = 4;
        //設置星期得加1
        calendar.set(Calendar.DAY_OF_WEEK, weekDay+1);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = dateFormat.format(calendar.getTime());
        //可以從數據庫獲取time
        String time = "08:16:10";
        String str = dateStr+" "+time;
        System.out.println(str);
        Calendar current = Calendar.getInstance();
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date =format.parse(str);
            calendar.setTime(date);
            //判斷是否在今日之前
            if(calendar.before(current)){
                calendar.add(Calendar.DAY_OF_WEEK, 7);
            }
        } catch (Exception e) {
        }
        long delay = calendar.getTimeInMillis()-current.getTimeInMillis();
        //獲取的毫秒值
        System.out.println(delay);
    }
    
}


下面是日期定時器,邏輯基本跟上面無異:

/***
 * @author ZHanG
 *這個類主要就是將設置日期定時器的第一個時間的毫秒值的計算
 *        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, delay, period);
        設置的參數爲delay
 */

public class DayMsec {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = dateFormat.format(calendar.getTime());
        String time = "23:06:00";
        String str =dateStr+" "+time;
        System.out.println(str);
        Calendar current = Calendar.getInstance();
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = format.parse(str);
            calendar.setTime(date);
            if(calendar.before(current)){
                calendar.add(Calendar.DAY_OF_YEAR, 1);
            }
        } catch (Exception e) {
        }
        long delay = calendar.getTimeInMillis()-current.getTimeInMillis();
        System.out.println(delay);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章