Timer类就像一个定时器,用于设置特定的时间或周期,来配合线程动作的执行,但是只调用Timer无法执行线程动作,必须配合另一个类TimerTask的方法才能使用。从示例6-13中可以发现Timer类与Thread类很相近。
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 javax.microedition.midlet.×;
import javax.microedition.lcdui.×;
import java.util.×;
public class threadDemo3 extends MIDlet
{
Display display;
canvasThread canvasthread;
public threadDemo3()
{
canvasthread=new canvasThread();
display=Display.getDisplay(this);
}
public void startApp()
{
display.setCurrent(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)
{
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0);
g.drawString("Timer线程动画应用", getWidth()/2, 20,
Graphics.HCENTER | Graphics.TOP);
g.drawImage(sunImage[view], getWidth()/2, 50, Graphics.HCENTER |
Graphics.TOP);
g.drawImage(cloudImage[view], getWidth()/2, 50, Graphics.HCENTER
| Graphics.TOP);
}
private void actionView()
{
/×
安排一个计划任务
运行任务内容:goCanvas()
delay时间:500毫秒
period周期:500毫秒
×/
timers.schedule(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控制暂停时间。