關於TimerTask與Timer類的應用

Timer類就像一個定時器,用於設置特定的時間或週期,來配合線程動作的執行,但是隻調用Timer無法執行線程動作,必須配合另一個類TimerTask的方法才能使用。從示例6-13中可以發現Timer類與Thread類很相近。

關於TimerTask與Timer類的應用

public Timer ()

創建一個新的timer對象。

Timer屬於計時器類,Time建立後,需要調用schedule()方法來執行計劃任務,計劃調度的方法有許多運用方式:

public void schedule (TimerTask task, long delay)

執行任務前先等待一段時間。task代表要執行的任務,delay代表需要等待的時間,單位爲毫秒(1000毫秒爲1秒)。

public void schedule (TimerTask task,

Date time)

在指定的系統時間time之後開始執行任務。

public void schedule (TimerTask task,

long delay,

long period)

延遲一段時間後開始執行任務,任務按照設定的週期執行。傳入的.參數:delay爲延遲時間,period爲週期時間,單位均爲毫秒。

public void schedule(TimerTask task,

Date firstTime,

long period)

在指定的時間後開始執行任務,任務按照設定的週期執行。傳入的參數:firstTime爲指定等待時間,period爲週期時間,單位都是毫秒。

public void scheduleAtFixedRate (TimerTask task,

long delay,

long period)

執行任務內容後,等待delay時間,再按照period週期時間繼續執行任務,單位都是毫秒。

public void scheduleAtFixedRate

(TimerTask task,

Date firstTime,

long period)

先等待一段時間firstTime,再執行計劃任務,然後按照period週期時間繼續執行任務,單位都是毫秒。

public void cancel()

停止timer計時。

有了Timer的各項調用方法,還不能直接執行計劃任務,需要跟TimerTask類共同運用才能使計劃任務開始運行。TimerTask所包含的相關方法如下:

public void TimerTask ()

創建一個新的TimerTask對象。

public abstract void run()

運行計劃任務的工作內容。

public void cancel()

中止TimerTask類的執行流程,不再執行所調度的工作內容。

public void scheduleExcutionTime()

實際運行計劃任務所用的時間。

示例6-13

Timer和TimerTask類運行計劃任務

×/

import et.×;

import i.×;

import .×;

public class threadDemo3 extends MIDlet

{

Display display;

canvasThread canvasthread;

public threadDemo3()

{

canvasthread=new canvasThread();

display=isplay(this);

}

public void startApp()

{

urrent(canvasthread);

}

public void pauseApp(){}

public void destroyApp(boolean unconditional){}

public class canvasThread extends Canvas

{

int gameaction=0;

int view=0;

boolean again;

//聲明一個Tim er類

Timer timers;

Image[] cloudImage;

Image[] sunImage;

public canvasThread()

{

timers=new Timer();

try{

cloudImage = new Image[]{

Image.createImage("/cloud-1.png"),

Image.createImage("/cloud-2.png"),

Image.createImage("/cloud-3.png"),

Image.createImage("/cloud-4.png")

};

sunImage = new Image[]{

Image.createImage("/sun-1.png"),

Image.createImage("/sun-2.png"),

Image.createImage("/sun-3.png"),

Image.createImage("/sun-4.png")

};

}catch(Exception ex){}

}

public void keyPressed(int keyCode)

{

gameaction=getGameAction(keyCode);

switch(gameaction)

{

case FIRE:

//運行計劃任務

actionView();

break;

}

}

public void paint(Graphics g)

{

olor(0xFFFFFF);

Rect(0, 0, getWidth(), getHeight());

olor(0);

String("Timer線程動畫應用", getWidth()/2, 20,

TER | );

Image(sunImage[view], getWidth()/2, 50, TER |

);

Image(cloudImage[view], getWidth()/2, 50, TER

| );

}

private void actionView()

{

安排一個計劃任務

運行任務內容:goCanvas()

delay時間:500毫秒

period週期:500毫秒

×/

dule(new goCanvas(), 500, 500);

}

//計劃任務程序內容

class goCanvas extends TimerTask

{

public void run()

{

repaint();

if(again)

view--;

else

view++;

if(again && view==0)

again=false;

if(!again && view==3)

again=true;

}

}

}

}

【說明】本線程使用計劃任務進行,所達到的效果跟使用線程的方式是相同的。只是在計劃的內容上有所不同,例如不需要sleep()暫停時間,而是由schedule控制暫停時間。