关于TimerTask与Timer类的应用

发布时间:2016-10-19 00:00:00 编辑:嘉辉 手机版

  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控制暂停时间。

本文已影响945
+1
0