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 =================================================== timer及timertask的用法 使用TimerTask import java.util.Timer; import java.util.TimerTask; import java.util.Date; /** * @author vincent */ public class TimerTest { public static void main(String[] args) { Timer t = new Timer(); //在5秒之後執行TimerTask的任務 t.schedule(new TimerTask(){ public void run() {System.out.println("this is task you do1");} },5*1000); //在Date指定的特定時刻之後執行TimerTask的任務 Date d1 = new Date(System.currentTimeMillis()+1000); t.schedule(new TimerTask(){ public void run() {System.out.println("this is task you do2");} },d1); //在Date指定的特定時刻之後,每隔1秒執行TimerTask的任務一次 Date d2 = new Date(System.currentTimeMillis()+1000); t.schedule(new TimerTask(){ public void run() {System.out.println("this is task you do3");} },d2,1*1000); //在3秒之後,每隔1秒執行TimerTask的任務一次 t.schedule(new TimerTask(){ public void run() {System.out.println("this is task you do4");} },3*1000,1*1000); //在3秒之後,絕對每隔2秒執行TimerTask的任務一次 t.scheduleAtFixedRate(new TimerTask(){ public void run() {System.out.println("this is task you do6");} },3*1000,2*1000); } schedule和scheduleAtFixedRate的區別在於,如果指定開始執行的時間在當前系統已耗用時間之前,scheduleAtFixedRate會把已經過去的時間也作為周期執行,而schedule不會把過去的時間算上。 比如 SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date d1 = fTime.parse("2005/12/30 14:10:00"); t.scheduleAtFixedRate(new TimerTask(){ public void run() { System.out.println("this is task you do6"); } },d1,3*60*1000); 間隔時間是3分鐘,指定開始時間是2005/12/30 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 並且注意,下一次執行是在14:19 而不是 14:20。就是說是從指定的開始時間開始計時,而不是從執行時間開始計時。 但是上面如果用schedule方法,間隔時間是3分鐘,指定開始時間是2005/12/30 14:10:00,那麼在14:17:00分執行這個程式,則立即執行程式一次。並且下一次的執行時間是 14:20,而不是從14:10開始算的周期(14:19)。 } |