Timer 与 TimerTask

在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务。比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask。

Timer是一个普通的类,其中有几个重要的方法;而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作。

schedule方法有三个参数
第一个参数就是TimerTask类型的对象,我们实现TimerTask的run()方法就是要周期执行的一个任务;
第二个参数有两种类型,第一种是long类型,表示多长时间后开始执行,另一种是Date类型,表示从那个时间后开始执行;
第三个参数就是执行的周期,为long类型。

schedule方法还有一种两个参数的执行重载,第一个参数仍然是TimerTask,第二个表示为long的形式表示多长时间后执行一次,为Date就表示某个时间后执行一次。

Timer就是一个线程,使用schedule方法完成对TimerTask的调度,多个TimerTask可以共用一个Timer,也就是说Timer对象调用一次schedule方法就是创建了一个线程,并且调用一次schedule后TimerTask是无限制的循环下去的,使用Timer的cancel()停止操作。当然同一个Timer执行一次cancel()方法后,所有Timer线程都被终止。


Timer和TimerTask是util包中两个与工作排程的类,Timer是计时器,可以设定成特定时间或特定的时间周期产生信号,不过这里只有Timer是没有用的,必须配合TimerTask才有作用。Timer一旦与某个TimerTask产生关联,就会在产生信号的同时,连带一起执行TimerTask所定义的工作。
 TimerTask的实现只需要继承TimerTask类就并实现其run()方法就可以了。run()方法是由我们自己来编写的,把你想做的工作放在里面,一旦Timer在特定时间内或周期产生信号,run()方法就会执行,我们通会Timer的schdeule()方法来设定特定时间或特定的周期。schdeule()有两种形式,一个是两个参数的,一个是三个参数的。二种参数的第一个参数是TimerTask的对象,第二个是时间也可是以Date对象。具有三个参数的schedule方法可以使一个task在某一个时间后,根据一定的间隔时间运行多次,具有周期性。最后,可以使用Timer的cancel()方法来停止Timer,调用cancel()之后,两者就会脱离关系。TimerTask本身也有cancel()方法。
我们看一个例子,在三秒之后执行某些工作:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class MyTask1 extends TimerTask
{
public void run()
{
System.out.println("Task1 Fire Time:") ;
System.out.println(System.currentTimeMillis());
}
}
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class TimerTest1 extends MIDlet
{
public TimerTest1()
{
}
public void startApp()
{
Timer timer = new Timer() ;
timer.schedule(new MyTask1(),3000);
System.out.println("Task Schedule Time:") ;
System.out.println(System.currentTimeMillis());
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}

这里,我们使用两种不同颜色来写书二个类,一个类继承TimerTask类,一个类继承MIDlet,这样编程有利于我们观察和以后的修改,不会出现一大长串代码的情况。
执行时会出现:
Task Schedule Time:
//时间
Task1 Fire Time:
//时间
我们可以发现两者之间相差3000毫秒。
这里schedule()方法除了给定一个long型外,还可以用上面所说的Date类的实体,假设我们在五秒后执行某些动作:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class MyTask2 extends TimerTask
{
public void run()
{
System.out.println("Task2 Fire Time:") ;
System.out.println(System.currentTimeMillis());
}
}
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class TimerTest2 extends MIDlet
{
public TimerTest2()
{
}
public void startApp()
{
Timer timer = new Timer() ;
Date after5sec = new Date(System.currentTimeMillis()+5000) ;
timer.schedule(new MyTask2(),after5sec);
System.out.println("Task Schedule Time:") ;
System.out.println(System.currentTimeMillis());
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}
我们可以发现两者之者大约相差为5000毫秒,但没有很精确,因为在调用(timer.schedule(new MyTask2(),after5sec))之前,系统必须先取得目前时间,再产生Date对象,而造成时间差。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值