JAVA基礎--Timer定時任務調度的簡單應用

時間任務調度,咱們必定不會陌生,那麼今天就來看看JDK中的時間任務調度工具Timer;java

什麼是定時任務調度:
    基於給定的時間點,給定的時間間隔或者給定的執行次數 自動執行的任務;併發

Timer簡介: 有且僅有 一個後臺線程 對 多個業務線程 進行 定時定頻率的調度;ide

關於Timer的測試代碼:函數

1, 首先建立任務 MyTimerTask 繼承 TimerTask 重寫 run():工具

package timer;

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask{
    
    private String name;
    
    private int count = 0;

    public MyTimerTask() {}

    public MyTimerTask(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        SimpleDateFormat sf  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            //測試 schedule() 與  scheduleAtFixedRate() 區別:
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(count<5){
            System.out.println("當前Task名稱:" + name + ", 執行時間:" + sf.format(scheduledExecutionTime()));
            count++;
        } else {
            //結束當前任務
            cancel(); 
            System.out.println("TimerTask "+name+" is cancel(), count="+count+", 最後執行時間:"+ sf.format(scheduledExecutionTime()));
        }
    }
    

}

2, Timer 調用測試:測試

package timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;

public class MyTimer {

    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        MyTimerTask myTimerTask = new MyTimerTask("NO.1.1");

        Calendar calender = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當前時間: " + sf.format(calender.getTime()));

        // ------------schedule的四種用法----------
        /**
         * 1, schedule(Task,Date time);在時間等於或着超過time的時候執行且執行一次task;
         */
        //calender.add(Calendar.SECOND, 3);
        // timer.schedule(myTimerTask, calender.getTime());

        /**
         * 2, schedule(task, Date firstTime, long period); 參數說明: task: 執行任務,
         * firstTime: 首次執行時間, period: 執行時間間隔(毫秒) 做用:
         * 時間等於或超過time時首次執行task,以後每隔period毫秒執行一次task;
         */
        // myTimerTask.setName("NO.1.2");
        // timer.schedule(myTimerTask, calender.getTime(), 2000L);

        /**
         * 3, schedule(TimerTask task, long delay); 做用: 等待 delay 毫秒後 執行且執行一次
         * task
         */
        // myTimerTask.setName("NO.1.3");
        // timer.schedule(myTimerTask, 1000L);

        /**
         * 4, schedule(TimerTask task, long delay, long period) 做用: 等待 delay毫秒後
         * 執行第一次 task,以後沒隔 period毫秒執行一次;
         */
        // myTimerTask.setName("NO.1.4");
        // timer.schedule(myTimerTask, 2000L, 1000L);

        // ---------------scheduleAtFixedRate的兩種用法---------------

        /**
         * 5, scheduleAtFixedRate(TimerTask task, long delay, long period); 做用:
         * 與4相同;
         */
        // myTimerTask.setName("NO.1.5");
        // timer.scheduleAtFixedRate(myTimerTask, 2000L, 1000L);

        /**
         * 6, scheduleAtFixedRate(TimerTask task, Date firstTime, long period);
         * 做用: 與2相同;
         */
        // myTimerTask.setName("NO.1.6");
        // timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 2000L);

        // ---------------------------其餘函數用法------------------------------------
        /**
         * 7, cancel(); 做用: 終止此計時器,丟棄全部當前已安排的任務;
         */
        // MyTimerTask myTimerTask2 = new MyTimerTask("NO.2.1");
        // timer.scheduleAtFixedRate(myTimerTask2, calender.getTime(), 2000L);

        // Thread.sleep(5000L);
        // timer.cancel();
        // System.out.println("timer is cancel()");

        /**
         * 8, purge(); 做用: 今後計時器的任務隊列中移除全部已取消的任務,並返回從隊列中移除的任務數;
         */
        // myTimerTask2.cancel();
        // int number = timer.purge();
        // System.out.println("timer is purge() number=" + number);

        // ---------schedule 和 scheduleAtFixedRate的區別:-------------

        /* 1, 首次計劃執行的時間早於當前的時間時; */
        
        //設置開始執行時間爲當前時間六秒前
//        calender.add(Calendar.SECOND, -6);
        /**
         * 9, schedule(); 
         *   "fixed-delay", 若是第一次執行時間被delay了,隨後的執行時間按照上一次實際執行的時間點進行計算;
         */
//        timer.schedule(myTimerTask, calender.getTime(), 1000L);

        /**
         * 10, scheduleAtFixedRate(); 
         *   "fixed-rate",若是第一次執行時間被delay了,隨後執行時間按照上一次開始時間點進行計算,
         *  而且爲了遇上進度會屢次執行任務,所以TimerTask中的執行體須要考慮同步;
         */
//        timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L);
        
        /* 2, 任務執行所需時間超出任務的執行週期間隔時; */
        /**
         * 11, schedule();
         *  下次執行時間相對上次實際執行完成的時間點,所以執行時間會不斷延後
         * */
//        timer.schedule(myTimerTask, calender.getTime(), 1000L);
        /**
         * 12, scheduleAtFixedRate();
         *  下次執行時間相對上次實際執行開始的時間點,所以執行時間不會延後,存在併發性;
         * */
        timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L);
        
        
        
        //------------------Timer的缺陷及使用禁區----------------------
        /**
         * 天生的兩種缺陷:
         *  1, 管理併發任務的缺陷;
         *      Timer有且僅有一個線程去執行定時任務,若是存在多個任務,且任務時間過長,會致使執行效果與預期不符;
         *  
         *  2, 當任務拋出異常時的缺陷;
         *      若是TimerTask拋出RuntimeException, Timer會中止全部的任務運行;
         * 
         * 使用禁區:
         *  1, 對時效性要求較高的多任務併發做業;
         *  
         *  2, 對複雜任務的調度;
         * */
        
        
        

    }

}
相關文章
相關標籤/搜索