看到別人代碼中使用到Timer和TimerTask來實現定時或者循環調用,自己使用了下,一個循環的timer不能暫停,cancel后就不能用了,必須要重新創建一個對象才合理,為此我覺得使用起來也不是很合理,不過貌似網上也不推薦使用這個java原生的東東。作為知識點,轉兩篇文章下來吧。
http://blog.chinaunix.net/uid-26524139-id-3152128.html
Timer是一種定時器工具,用來在一個后台線程計划執行指定任務。它可以計划執行一個任務一次或反復多次。
TimerTask一個抽象類,它的子類代表一個可以被Timer計划的任務。
schedule的意思(時間表、進度表)
timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);
第一個參數"new MyTask(event.getServletContext())":
是 TimerTask 類,在包:import java.util.TimerTask .使用者要繼承該類,並實現 public void run() 方法,因為 TimerTask 類實現了 Runnable 接口。
第二個參數"0"的意思是:(0就表示無延遲)
當你調用該方法后,該方法必然會調用 TimerTask 類 TimerTask 類 中的 run() 方法,這個參數就是這兩者之間的差值,轉換成漢語的意思就是說,用戶調用 schedule() 方法后,要等待這么長的時間才可以第一次執行 run() 方法。
第三個參數"60*60*1000"的意思就是:
(單位是毫秒60*60*1000為一小時)
(單位是毫秒3*60*1000為三分鍾)
第一次調用之后,從第二次開始每隔多長的時間調用一次 run() 方法
例子:
public Timer createJobber(TimerTask o, String cronExpress) throws Exception {
Timer timer = new Timer();
timer.schedule(o, 0, Integer.parseInt(cronExpress));
return timer;
}
http://dev.10086.cn/cmdn/bbs/thread-59000-1-1.html
Timer與TimerTask的用法
Java2的開發包中提供了一種很使用的線程功能:提前安排將來某段時間執行某任務Timer ,TimerTask。你可以使用這些類創建后台進程,讓其在等待一段規定的時間后執行,或者讓其沒隔一段時間執行。你也可以用Thread來完成,但利用Timer與TimerTask顯然省事不少。 TimerTask實現了Runnable接口,待執行的任務置於run()中。Timer是一個安排TimerTask的類此此兩者一般一起工作。所應用時首先硬創建一個TimerTask的對象,然后用一個Timer的類對象安排執行它 Timer類包含的方法有: 1.Timer() 以常規方式運行task 2.Timer(boolean) true時使用后台進程線程。只要剩下的程序記敘運行,后台進程線程就會執行。 3.public void cancel() 終止Timer的功能執行,但不會對正在執行的任務有影響。當執行cancel方法后將不能再用其分配任務。 4.public void schedule(TimerTask task,Date time) task被安排在time指定的時間執行,如果時間為過去時則任務立刻執行。 5.public void schedule(TimerTask task, Date firstTime, long period) task被安排在time指定的時間執行,執行后將每隔period(毫秒)反復執行。由於規定的時間間隔並不能保證與時鍾精准的同不步,所以該方法最適合從短期看保持頻率准確是更重要的的地方 6.public void schedule(TimerTask task, long delay) task被安排在delay(毫秒)指定的時間后執行。 7.public void schedule(TimerTask task,long delay, long period) task被安排在delay(毫秒)指定的時間后執行。執行后將每隔period(毫秒)反復執行。 8.public void scheduleAtFixedRate(TimerTask task,Date firstTime, long period) task被安排在firstTime指定的時間執行。執行后將每隔period(毫秒)反復執行。每一次重復的時間時盒第一次執行而不是和前一次執行有關。因此執行的總速度是固定的。 9.public void scheduleAtFixedRate(TimerTask task,long delay,long period) task被安排在delay(毫秒)指定的時間后執行。執行后將每隔period(毫秒)反復執行。每一次重復的時間時盒第一次執行而不是和前一次執行有關。因此執行的總速度是固定的。 TimerTask的主要方法: 1.public boolean cancel() 終止任務的執行運行。如果Timer時要求循環執行的,則如果正在執行,則執行完了就再步會循環。如果還未執行或處於停歇期,則不會執行了 2.public abstract void run() 3.public long scheduledExecutionTime() 返回被安排最后執行任務的時間。一般確定任務的當今的實行是否足夠及時 ,證明進行被計划的活動為正當: public void run() { if (System.currentTimeMillis() - scheduledExecutionTime() >= MAX_TARDINESS) return; // Too late; skip this execution. // Perform the task } 4.protected TimerTask()例:import java.util.*; import java.io.*; public class doTask extends TimerTask { String index; Timer myTimer = new Timer(); public doTask(String index) { this.index = index; } public void run() { System.out.println(index); } public static void main(String args) { doTask myTask1 = new doTask("First task"); myTask1.start(0,3); doTask myTask2 = new doTask("Second task"); myTask2.start(0,1); try{ Thread.sleep(6000); } catch(InterruptedException e){ } myTask1.end(); myTask2.end();//程序結束時用cancel()結束Timer } public void start(int delay, int internal) { myTimer.schedule(this, delay * 1000, internal * 1000); //利用timer.schedule方法 } public void end(){ myTimer.cancel(); } } 輸出: First task Second task Second task Second task First task Second task Second task Second task |