Java自帶的java.util.Timer類,經過調度一個java.util.TimerTask任務。這種方式可讓程序按照某一個頻度執行,但不能指定時間運行。用的較少。java
任務的調用經過起的子線程進行執行。ide
java.util.Timerspa
java.util.TimerTask
線程
1、調用方法:日誌
(1)void java.util.Timer.schedule(TimerTask task, long delay):多長時間(毫秒)後執行任務code
(2)void java.util.Timer.schedule(TimerTask task, Date time):設定某個時間執行任務orm
(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay時間後開始執行任務,並每隔period時間調用任務一次。get
(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime時間點執行任務,以後每隔period時間調用任務一次。it
(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay時間後開始執行任務,並每隔period時間調用任務一次。io
(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime時間點執行任務,以後每隔period時間調用任務一次。
void java.util.Timer.cancel():終止該Timer
boolean java.util.TimerTask.cancel():終止該TimerTask
能夠爲每一個Timer指定多個TimerTask
雖然可經過void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成「例如:天天上午10點執行一次」的業務,但該實現是基於進行一天(1000 * 60 * 60 * 24毫秒)進行延遲的機制實現的,並非指定某個具體時間進行執行的。
對於該種需求,可經過Quartz來進行實現
2、方法名稱schedule()和scheduleAtFixedRate()二者的區別
當須要根據period區間時間循環屢次調用任務的時候,會存在兩種不一樣的策略,兩種方法提供了不一樣的策略。
調用方法(1)、(2)只是單次執行,不存在屢次調用任務的狀況,因此沒有提供scheduleAtFixedRate方法的調用方式。
<1>schedule()方法更注重保持間隔時間的穩定:保障每隔period時間可調用一次
<2>scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障屢次調用的頻率趨近於period時間,若是某一次調用時間大於period,下一次就會盡可能小於period,以保障頻率接近於period
3、示例
(1)
/** * 第一種方法:設定多長時間(毫秒)後執行任務 */ public static void timer1() { final StopWatch watch = new StopWatch(); watch.start(); Timer timer = new Timer(); /* void java.util.Timer.schedule(TimerTask task, long delay) */ timer.schedule(new TimerTask() { public void run() { watch.stop(); System.out.println("-------任務執行--------"); System.out.println(watch.getTime()); } }, 2000);// delay=2000毫秒 後執行該任務 }
(2)
/** * 第二種方法:設定某個時間執行任務 */ public static void timer2() { Calendar calendar = new GregorianCalendar(); calendar.add(Calendar.MINUTE, 1); calendar.set(Calendar.SECOND, 0); // 一分鐘後執行 Timer timer = new Timer(); /* void java.util.Timer.schedule(TimerTask task, Date time) */ timer.schedule(new TimerTask() { @Override public void run() { System.out.println("-------任務執行--------"); } }, calendar.getTime()); }
(3)
/** * 第三種方法:設定指定任務task在指定延遲delay後進行固定延遲peroid的執行 */ public static void timer3() { Timer timer = new Timer(); final StopWatch watch = new StopWatch(); watch.start(); System.out.println(Thread.currentThread().getName()); /* * void java.util.Timer.schedule(TimerTask task, long delay, long * period) */ timer.schedule(new TimerTask() { public void run() { /* 子線程進行任務的執行 */ System.out.println(Thread.currentThread().getName()); System.out.println("-------設定要指定任務--------"); watch.suspend(); System.out.println(watch.getTime()); watch.reset(); watch.start(); } }, 1000, 1000); }
(4)
/** * 固定延遲peroid時間後執行;peroid時間不是以任務執行完的時間爲計算起點(某次任務執行完成後,通過peroid時間後再次調用[不是這樣的])。 * 而是每隔peroid時間調用任務一次。當任務執行的時間小於peroid時間,能夠保證每隔peroid時間調用一次。 * 當任務的執行時間大於peroid時間時,從現象上看:任務一執行完,就會馬上進入下一次任務的執行 */ public static void timer3a() { Timer timer = new Timer(); final StopWatch watch = new StopWatch(); watch.start(); timer.schedule(new TimerTask() { Integer i = 1; public void run() { System.out.println(watch.getTime()); System.out.println("########第" + i + "次執行開始########"); try { Thread.sleep(400); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("########第" + i + "次執行結束########"); i++; watch.reset(); watch.start(); } }, 1000, 500); }
period:500毫秒;每次任務執行時間400毫秒;因此每次任務執行完成後到下一次任務調用開始的時間趨近於100毫秒
打印日誌信息
1000
########第1次執行開始########
########第1次執行結束########
109
########第2次執行開始########
########第2次執行結束########
93
########第3次執行開始########
########第3次執行結束########
93
########第4次執行開始########
########第4次執行結束########
93
########第5次執行開始########
########第5次執行結束########
93
########第6次執行開始########
########第6次執行結束########
93
########第7次執行開始########
########第7次執行結束########
93
########第8次執行開始########
當將Thread.sleep(400);修改成Thread.sleep(600)時:
打印日誌信息:
1000
########第1次執行開始########
########第1次執行結束########
0
########第2次執行開始########
########第2次執行結束########
0
########第3次執行開始########
########第3次執行結束########
0
########第4次執行開始########
########第4次執行結束########
0
########第5次執行開始########
(5)
/** * 第四種方法:安排指定的任務task在指定的時間firstTime開始進行重複的固定速率period執行 * 天天中午12點都執行一次 */ public static void timer4() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制時 calendar.set(Calendar.MINUTE, 0); // 控制分 calendar.set(Calendar.SECOND, 0); // 控制秒 Date time = calendar.getTime(); // 得出執行任務的時間,此處爲今天的12:00:00 Timer timer = new Timer(); /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */ timer.schedule(new TimerTask() { public void run() { System.out.println("-------設定要指定任務--------"); } }, time, 1000 * 60 * 60 * 24);// 這裏設定將延時天天固定執行 }
(6)
/** * 第五種方法:設定指定任務task在指定延遲delay後進行固定頻率peroid的執行。 * timer.schedule和timer.scheduleAtFixedRate的區別: * (1)schedule()方法更注重保持間隔時間的穩定:保障每隔period時間可調用一次 * (2)scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障屢次調用的頻率趨近於period時間,若是某一次調用時間大於period,下一次就會盡可能小於period,以保障頻率接近於period */ public static void timer5() { Timer timer = new Timer(); /* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */ timer.scheduleAtFixedRate(new TimerTask() { public void run() { System.out.println("-------設定要指定任務--------"); } }, 1000, 500); }