[ImportNew]Java中的Timer类和TimerTask类
http://www.importnew.com/9978.html
java.util.Timer是一個實用工具類,該類用來調(diào)度一個線程,使它可以在將來某一時刻執(zhí)行。 Java的Timer類可以調(diào)度一個任務運行一次,或定期運行。
java.util.TimerTask是一個抽象類,它實現(xiàn)了Runnable接口。我們需要擴展該類以便創(chuàng)建自己的TimerTask,這個TimerTask內(nèi)部使用java Timer類,可以被調(diào)度。
Timer類是線程安全的,多進程不需要外部同步機制就可以共享同一個Timer對象。Timer類使用java.util.TaskQueue在指定時間間隔添加任務,在任何時刻只能有一個線程執(zhí)行TimerTask。例如,創(chuàng)建一個每10秒運行的Timer,但單個線程的執(zhí)行時間花費20秒,Timer對象將持續(xù)將任務添加到隊列,一旦有任務結(jié)束,它就會通知隊列,并且另外一個線程將啟動執(zhí)行。
Timer類使用對象的wait和notify方法來調(diào)度任務。
如下是一個使用Timer和TimerTask的實例。
MyTimerTask.java
1 import java.util.Date; 2 import java.util.Timer;//Timer類在JDK中3個包下都有.這個是util包下的. 3 import java.util.TimerTask; 4 5 public class MyTimerTask extends TimerTask { 6 7 @Override 8 public void run() { 9 System.out.println("Timer task started at:"+new Date()); 10 completeTask();//就是讓線程睡兩秒 11 System.out.println("Timer task finished at:"+new Date()); 12 } 13 14 private void completeTask() { 15 try { 16 //assuming it takes 20 secs to complete the task 17 Thread.sleep(20000); 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21 } 22 23 public static void main(String args[]){ 24 TimerTask timerTask = new MyTimerTask(); 25 //running timer task as daemon thread 26 Timer timer = new Timer(true); 27 timer.scheduleAtFixedRate(timerTask, 0, 10*1000); 28 System.out.println("TimerTask started"); 29 //cancel after sometime 30 try { 31 Thread.sleep(120000); 32 } catch (InterruptedException e) { 33 e.printStackTrace(); 34 } 35 timer.cancel(); 36 System.out.println("TimerTask cancelled"); 37 try { 38 Thread.sleep(30000); 39 } catch (InterruptedException e) { 40 e.printStackTrace(); 41 } 42 } 43 }輸出的結(jié)果:
TimerTask started Timer task started at:Sat Mar 07 20:39:24 CST 2015 Timer task finished at:Sat Mar 07 20:39:44 CST 2015 Timer task started at:Sat Mar 07 20:39:44 CST 2015 Timer task finished at:Sat Mar 07 20:40:04 CST 2015 Timer task started at:Sat Mar 07 20:40:04 CST 2015 Timer task finished at:Sat Mar 07 20:40:24 CST 2015 Timer task started at:Sat Mar 07 20:40:24 CST 2015 Timer task finished at:Sat Mar 07 20:40:44 CST 2015 Timer task started at:Sat Mar 07 20:40:44 CST 2015 Timer task finished at:Sat Mar 07 20:41:04 CST 2015 Timer task started at:Sat Mar 07 20:41:04 CST 2015 TimerTask cancelled Timer task finished at:Sat Mar 07 20:41:24 CST 2015public void scheduleAtFixedRate(TimerTask?task,long?delay,long?period)安排指定的任務在指定的延遲后開始進行重復的固定速率執(zhí)行。以近似固定的時間間隔(由指定的周期分隔)進行后續(xù)執(zhí)行。?task - 所要安排的任務。delay - 執(zhí)行任務前的延遲時間,單位是毫秒。period - 執(zhí)行各后續(xù)任務之間的時間間隔,單位是毫秒。
public void cancel()終止此計時器,丟棄所有當前已安排的任務。這不會干擾當前正在執(zhí)行的任務(如果存在)。一旦終止了計時器,那么它的執(zhí)行線程也會終止,并且無法根據(jù)它安排更多的任務。?
注意,在此計時器調(diào)用的計時器任務的 run 方法內(nèi)調(diào)用此方法,就可以絕對確保正在執(zhí)行的任務是此計時器所執(zhí)行的最后一個任務。
可以重復調(diào)用此方法;但是第二次和后續(xù)調(diào)用無效。
輸出結(jié)果證實,如果一個任務已經(jīng)執(zhí)行,Timer將等待它執(zhí)行結(jié)束,一旦任務執(zhí)行結(jié)束,Timer對象將再次啟動隊列中的下一個任務。
Timer對象可作為一個守護線程運行相關的任務。Timer的cancel()方法用于終止計時器,并丟棄待調(diào)度的任務。然而,Timer不會干擾當前執(zhí)行的任務,并且讓它執(zhí)行結(jié)束。如果計時器用于執(zhí)行守護線程,無論是否取消它,它都會等待所有用戶線程結(jié)束后終止。
Timer類包含一些sechedule()方法用于調(diào)度一個任務在指定時間運行一次或者延時之后運行。還有一些scheduleAtFixedRate()方法用于在一定間隔后周期運行任務
當使用Timer調(diào)度任務時,必須確保時間間隔超過正常程序運行時間,否則任務隊列的大小將持續(xù)增長,最終程序?qū)o法停止。
?
總結(jié)
以上是生活随笔為你收集整理的[ImportNew]Java中的Timer类和TimerTask类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL如何导出存储过程和触发器?
- 下一篇: 使用SVN的hook将更新内容同步到测试