1. 程式人生 > >定時器Timer使用

定時器Timer使用

android專案中使用Timer跟TimerTask時,發現IDE老是提示紅色,一直提示我要用ScheduledExecutorService,相信使用android studio的小夥伴們一定不會陌生的,下面來看二者的使用

1、Timer 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("timerTask--run--" + sdf.format(new Date(System.currentTimeMillis())));
            }
        };
        Timer timer = new Timer();
        try {
            timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
//            timer.scheduleAtFixedRate(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
        } catch (ParseException e) {
            e.printStackTrace();
        }

用法很簡單,呼叫timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);這個方法,引數一表示任務,引數而表示延長多久時間執行,引數三表示間隔多久重複執行;

注意:timer.scheduleAtFixedRate()與timer.schedule()區別:

區別一:當設定的延遲時間是過去時間,則timer.schedule()會先執行一次然後按照間隔時間執行,而timer.scheduleAtFixedRate連續執行從time到現在應該執行的任務,直到當前時間再按照每隔period的時間執行

TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("timerTask--run--1--" + sdf.format(new Date(System.currentTimeMillis())));
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Timer timer = new Timer();
        try {
//            timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
            timer.scheduleAtFixedRate(timerTask,sdf.parse("2018-12-27 11:21:00"),5000);
        } catch (ParseException e) {
            e.printStackTrace();
        }

timerTask--run--1--2018-12-27 11:23:17
timerTask--run--1--2018-12-27 11:23:18
timerTask--run--1--2018-12-27 11:23:19
timerTask--run--1--2018-12-27 11:23:20
timerTask--run--1--2018-12-27 11:23:21
timerTask--run--1--2018-12-27 11:23:22
timerTask--run--1--2018-12-27 11:23:23
timerTask--run--1--2018-12-27 11:23:25
timerTask--run--1--2018-12-27 11:23:30
timerTask--run--1--2018-12-27 11:23:35
timerTask--run--1--2018-12-27 11:23:40
timerTask--run--1--2018-12-27 11:23:45

timer.schedule()執行日誌

timerTask--run--1--2018-12-27 11:27:52
timerTask--run--1--2018-12-27 11:27:57
timerTask--run--1--2018-12-27 11:28:02
timerTask--run--1--2018-12-27 11:28:07
timerTask--run--1--2018-12-27 11:28:12
區別二:schedule方法的下一次執行時間是(本次準確執行時間+週期),而scheduleAtFixedRate方法的下一次執行是(本次應該執行的時間+週期)。schedule方法有可能因為上次任務的時間過長導致下次任務的執行時間往後推移,而scheduleAtFixed的每次任務的執行時間是固定的,只要這個任務被提交了,那麼每次的執行時間就是固定的,但是我測試的時間都是一樣都是執行時間如果大於間隔時間會等任務執行完以後才會執行下次任務,而且是以執行時間為準,這裡不理解?求各位路過的大神指教

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("timerTask--run--1--" + sdf.format(new Date(System.currentTimeMillis())));
                try {
                    Thread.sleep(6000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Timer timer = new Timer();
        try {
//            timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
            timer.scheduleAtFixedRate(timerTask,sdf.parse("2018-12-27 11:21:00"),5000);
        } catch (ParseException e) {
            e.printStackTrace();
        }

timerTask--run--1--2018-12-27 11:35:39
timerTask--run--1--2018-12-27 11:35:45
timerTask--run--1--2018-12-27 11:35:51
timerTask--run--1--2018-12-27 11:35:57
timerTask--run--1--2018-12-27 11:36:03
timerTask--run--1--2018-12-27 11:36:09
timerTask--run--1--2018-12-27 11:36:15
timerTask--run--1--2018-12-27 11:36:21

日誌都是一樣的間隔6秒執行下次任務