java定時器Timer的使用
1、構造方法
①Timer timer = new Timer();
②定時器為守護程序
boolean flag=true;
Timer timer1 =new Timer(flag);
③指定定時器的名字,方便指定停止
String name="TimerName2";
Timer timer2 =new Timer(name);
④指定定時器的名字,並指定為守護程序
String name3="TimerName3";
Timer timer3 =new Timer(name3, flag);
2、方法
①延時delay時間後執行task
public void schedule( TimerTask task,long delay)
②指定時間執行taskpublic void schedule(TimerTask task,Date time)
③period:間隔週期 delay:執行延時週期 開始delay時間後間隔period執行task
public void schedule(TimerTask task, long delay,long period)
④間隔period時間,在指定firstTime時間執行
public void schedule(TimerTask task,Date firstTime,long period)
⑤period:間隔週期 delay:執行延時週期 開始public void scheduleAtFixedRate(TimerTask task,long delay,long period)
⑥間隔period時間,在指定firstTime時間執行
public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
⑦定時器停止執行
public void cancel()
⑧從這個計時器的任務佇列中移除所有已取消的任務。public int purge()
3、example4、schedule與scheduleAtFixedRate區別package com.assp.admin.web.controller; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class JobTestController extends TimerTask { String jobName = ""; public JobTestController(String jobName) { this.jobName = jobName; } @Override public void run() { System.out.println("go::::" + jobName); } public static void main(String[] args) { Date t=new Date(); long tl=t.getTime(); Timer timer = new Timer(); boolean flag=true; Timer timer1 =new Timer(flag); String name="TimerName2"; Timer timer2 =new Timer(name); String name3="TimerName3"; Timer timer3 =new Timer(name3, flag); long delay1 = 1 * 1000; long period1 = 1000; // period1:間隔週期 delay1:執行延時週期 //從現在開始 1 秒鐘之後,每隔 1 秒鐘執行一次 job1 timer.schedule(new JobTestController("job1"), delay1, period1); long delay2 = 2 * 1000; long period2 = 2000; // 從現在開始 2 秒鐘之後,每隔 2 秒鐘執行一次 job2 timer.schedule(new JobTestController("job2"), delay2, period2); timer1.schedule(new JobTestController("timer1"), delay2, period2); //timer2.schedule(new JobTestController("timer2"), delay2, period2); //timer3.schedule(new JobTestController("timer3"), delay2, period2); timer1.cancel(); } }
public static void main(String[] args) {
Timer timer = new Timer();
SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = null;
try {
d1 = fTime.parse("2016/09/02 17:12:00");
} catch (ParseException e) {
e.printStackTrace();
}
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("this is task you do6");
}
}, d1, 3 * 60 * 1000);
}
上面例子間隔時間是3分鐘,指定開始時間是2006/09/02 14:10:00,如果我在14:17:00分執行這個程式,會立刻列印3次
this is task you do6 //14:10
this is task you do6 //14:13
this is task you do6 //14:16
如果用schedule方法,相同引數條件下,在14:17:00執行,則立即執行一次,且下次的執行時間是14:20:00,而不是14:19:00
需要注意:scheduleAtFixedRate和schedule在引數完全相同的情況下,執行效果不同。上面是簡單的例子,在實際的專案中,定時任務比較複雜,由於某種原因(如垃圾回
收或者其他後臺活動)延遲了某次的執行,則scheduleAtFixedRate方法將快速連續的出現兩次或更多的執行,從而使後續執行能力追趕上來;而schedule方法的後續執行也
將被延遲。所以,在長期的執行中,scheduleAtFixedRate執行的頻率將整好是指定週期的倒數,schedule執行的頻率一般要稍慢於指定週期倒數。
結論:scheduleAtFixedRate 效率總體上高於schedule
4、總結
Timer 的優點:簡單易用
Timer 的缺點:
①. Timer是基於絕對時間的。容易受系統時鐘的影響。
②. 單執行緒。所有TimeTask可能會相關影響
③. Timer不會捕獲TimerTask的異常,只是簡單地停止。這樣勢必會影響其他TimeTask的執行。
Timer 實現任務排程的核心類:Timer 和 TimerTask。 Timer 負責設定 TimerTask 的起始與間隔執行時間。
Timer 的設計核心: TaskList 、TaskThread。Timer 將接收到的任務丟到自己的 TaskList 中,TaskList 按照 Task 的最初執行時間進行排序。TimerThread 在建立Timer時會啟動成為一個守護執行緒。這個執行緒會輪詢所有任務,找到一個最近要執行的任務,然後休眠,當到達最近要執行任務的開始時間點,TimerThread 被喚醒並執行該任務。之後 TimerThread 更新最近一個要執行的任務,繼續休眠。
Timer 使用:使用者只需要建立一個 TimerTask 的繼承類,實現自己的 run 方法,然後將其丟給 Timer 去執行即可。