java之定時器任務Timer用法

來源:互聯網
上載者:User

標籤:delay   sim   form   計算   font   .text   schedule   test   執行   

在項目開發中,經常會遇到需要實現一些定時操作的任務,寫過很多遍了,然而每次寫的時候,總是會對一些細節有所遺忘,後來想想可能是沒有總結的緣故,所以今天小編就打算總結一下可能會被遺忘的小點:

 1. public void schedule(TimerTask task,Date time) 這個方法中如啟動時,已經過了time的時間,則系統會在啟動後直接執行一次,
    話不多少直接上代碼
package com.test.timer.task;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import org.junit.Test;/** *  * java實現定時器的若干方法 *  * @author jimi * */public class TestTask {        private static Timer timer = new Timer();        private static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");        public static void main(String[] args){        Calendar calendar = Calendar.getInstance();        int year = calendar.get(Calendar.YEAR);               int month = calendar.get(Calendar.MONTH);        int day = calendar.get(Calendar.DAY_OF_MONTH);        calendar.set(year,month,day,20,35,00);                //如果這個時間已經過了,則會啟動會立即執行一次        timer.schedule(new TimerTask() {            @Override            public void run() {                System.out.println("固定執行任務的時間:" + dateFormat.format(new Date()));            }        }, calendar.getTime());    }    }
代碼中我指定在當天的20時35分執行,啟動程式後的結果如下:


可以看到我程式是在20:40:47執行的,已經超過我設定的20時35分00秒,所以啟動後直接執行一次。

2. schedule(TimerTask task,long delay,long period) 和 scheduleAtFixedRate(TimerTask task,long delay,long period)方法的區別
簡單來說就是定時執行scheduleAtFixedRate不受外界影響,假如某一次TimerTask執行時間超過了定時執行循環,下一次執行時間不會受該任務執行時間的影響,
依然會在指定時間執行,而
schedule則會受影響,直接上代碼來看:

package com.test.timer.task;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;/** *  * java實現定時器的若干方法 *  * @author jimi * */public class TestTask {        private static Timer timer = new Timer();        private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        private static int index = 0;        public static void main(String[] args) throws ParseException{                //固定速率        timer.scheduleAtFixedRate(new TimerTask() {                    @Override                    public void run() {                        index++;                        if (index % 5 == 0){                            try {                                Thread.sleep(5000);                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                        }                        System.out.println("每隔4秒執行一次:" + dateFormat.format(new Date()));                    }                }, 0, 4000);            }    }

從代碼可以看出,在index為5的倍數時,程式會休眠5秒,我們了來看看執行的結果

每隔4秒執行一次:2018-08-10 19:12:09
每隔4秒執行一次:2018-08-10 19:12:13
每隔4秒執行一次:2018-08-10 19:12:17
每隔4秒執行一次:2018-08-10 19:12:21
每隔4秒執行一次:2018-08-10 19:12:30
每隔4秒執行一次:2018-08-10 19:12:30
每隔4秒執行一次:2018-08-10 19:12:33
每隔4秒執行一次:2018-08-10 19:12:37
每隔4秒執行一次:2018-08-10 19:12:41
每隔4秒執行一次:2018-08-10 19:12:50
每隔4秒執行一次:2018-08-10 19:12:50
每隔4秒執行一次:2018-08-10 19:12:53
每隔4秒執行一次:2018-08-10 19:12:57
每隔4秒執行一次:2018-08-10 19:13:01
每隔4秒執行一次:2018-08-10 19:13:10
每隔4秒執行一次:2018-08-10 19:13:10

我們可以看出在第五次和第六次同時運行,且第七次的時間並未是在19:12:30的基礎加4秒,而是在程式啟動後預先計算好的時間也就是19:12:33秒,所可以看scheduleAtFixedRate的執行時間是按照預先的固定速率來執行,不會因為某一次的延遲而影響後面的計劃時間。

我們再來看看schedule的代碼和執行情況

package com.test.timer.task;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;/** *  * java實現定時器的若干方法 *  * @author jimi * */public class TestTask {        private static Timer timer = new Timer();        private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        private static int index = 0;        public static void main(String[] args) throws ParseException{                //非固定速率        timer.schedule(new TimerTask() {                        @Override            public void run() {                index++;                if (index % 5 == 0){                    try {                        Thread.sleep(5000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                System.out.println("每隔4秒執行一次:" + dateFormat.format(new Date()));            }        }, 0, 4000);    }    }

執行情況如下

每隔4秒執行一次:2018-08-10 19:17:12每隔4秒執行一次:2018-08-10 19:17:16每隔4秒執行一次:2018-08-10 19:17:20每隔4秒執行一次:2018-08-10 19:17:24每隔4秒執行一次:2018-08-10 19:17:33每隔4秒執行一次:2018-08-10 19:17:33每隔4秒執行一次:2018-08-10 19:17:37每隔4秒執行一次:2018-08-10 19:17:41每隔4秒執行一次:2018-08-10 19:17:45每隔4秒執行一次:2018-08-10 19:17:54每隔4秒執行一次:2018-08-10 19:17:54每隔4秒執行一次:2018-08-10 19:17:58

可以看出schedule在執行完第5、6次任務後,第7次的時間則是按照定時計劃4秒後執行的,可見schedule在任務執行過程中,如果某一次任務延時,則後續任務會跟著延時後的時間重新計算定時執行時間。

 

 

好了,小編今天就先碼到這裡,後面可能還會再介紹spring的定時任務,以及spring+quartz實現的定時任務。

 

 

 




 

java之定時器任務Timer用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.