標籤: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用法