《Java典型模块与项目实战大全》第8章关机工具(Timer类+系统命令),本章将通过模拟关机工具的功能,介绍如何调用Windows系统命令,还将详细介绍线程的类Timer。本节为大家介绍Timer和TimerTask类。
8.3.1 Timer和TimerTask类(2)
最后,通过查看API帮助文档可以发现,如果想实现执行计划、定时任务,首先需要继承TimerTask类并重写该类的run()方法来实现任务功能,然后通过调用Timer类的schedule()方法执行TimerTask类对象。详细介绍如下。
1.TimerTask类
对于TimerTask类,其是扩展了Object并实现了Runnable接口的抽象类,因此在具体编程时,可以在public void run()方法中编写具体的执行任务。该类拥有几个重要方法,如下所示。
(1)public boolean cancel()
该方法用来终止计时器任务的执行运行。
注意:Timer类要求循环执行任务(TimerTask任务)时,如果该对象正在执行,则会在执行完之后不会再循环执行;如果还未执行或处于停歇期,则不会执行。
(2)public abstract void run()
该方法为计时器任务要执行的操作。
(3)public long scheduledExecutionTime()
该方法用来返回计时器任务被安排最后执行的时间,一般用来确定计时器任务的运行是否足够及时,执行是否正当。
2.Timer类
对于Timer类,主要用来控制TimerTask类的任务执行一次或者定期重复执行,该类拥有4个构造函数,分别如下。
(1)Timer()
该构造函数用来创建一个默认的计时器。
(2)Timer(boolean isDaemon)
参数isDaemon指定线程的守护,创建一个指定守护线程的计时器。
注意:当参数isDaemon为true时,该计时器对象相关线程为后台进程线程,根据线程知识可以知道,如果应用程序中还有程序继续运行,后台线程进程就不会停止 执行。
(3)Timer(String name)
参数name为线程的名字,用来创建一个指定名称的相关线程的计时器。
(4)Timer(String name, boolean isDaemon)
该函数用来创建一个新计时器,不仅指定相关线程的名称,而且还指定其为后台线程。
在具体创建计时器对象时,不推荐使用Timer timer = new Timer(true)语句。因为这种方式创建的计时器对象,在应用程序结束后会自动结束,非常不利于使用。
yu我的理解是:对于非Daemon线程中的timer, 线程结束了,timer也就不存在了.
而在Daemon线程中的timer,可能使用timer的线程已退出,但timer所在线程仍在继续调度timer
除了构造函数外,该Timer类还拥有其他几个重要方法,其中最重要的方法就是各种重载的schedule()方法和scheduleAtFixedRate()方法,分别如下:
(1)public void schedule(TimerTask task,Date time)
参数task为所计时器任务对象,参数time为Data类型对象,该方法用来实现在指定的时间后执行计时器任务。
注意:如果参数time为过去时,则任务task对象会立刻执行。
(2)public void schedule(TimerTask task, long delay)
参数delay为long类型,该方法用来实现在指定的时间(毫秒)后执行计时器任务。
(3)public void schedule(TimerTask task, Date firstTime, long period)
参数firstTime为Date类型,表示第一次执行的时间;参数period为long类型,表示间隔的时间(毫秒);该方法用来在firstTime时间后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间会因为前一次task的执行时间受到影响。
(4)public void schedule(TimerTask task,long delay, long period)
参数delay为long类型,该方法用来在firstTime时间(毫秒)后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间会因为前一次task的执行时间受到影响。
注意:当表示时间的参数为long类型时,表示毫秒。由于long类型的时间并不能保证与时钟准确同步,所以拥有long类型的时间参数适合短期的保持频率。
(5)public void scheduleAtFixedRate(TimerTask task,Date firstTime, long period)
参数firstTime为Date类型,该方法用来在firstTime时间后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间不会因为前一次task的执行时间受到影响。
(6)public void scheduleAtFixedRate(TimerTask task,long delay,long period)
参数firstTime为long类型,该方法用来在delay时间后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间不会因为前一次task的执行时间受到影响。
当需要反复执行的任务时,如果注重任务执行的平滑度,那么需要使用schedule()方法,如果注重任务执行的频度,那么需要使用scheduleAtFixedRate()方法。例如,当使用schedule()方法时,意味着所有计时器任务之间的时间间隔至少为1秒,即如果有一个计时器任务因为某种原因迟到了(未按计划执行),那么余下的所有计时器任务都要延时执行。当使用scheduleAtFixedRate()方法时,如果有一个计时器任务因为某种原因迟到了(未按计划执行),那么后面余下的所有计时器任务还会以固定的间隔时间执行。即schedule()方法会实现固定延迟执行功能,而scheduleAtFixedRate()方法会实现固定速率执行功能。
最后还存在一个关闭Timer类的对象方法,如下所示。
- public void cancel()
该方法用来终止Timer的功能执行。
注意:当执行该方法后,虽然不会对正在执行的任务有影响,但是却不会再分配其他任务。
回书目 上一节 下一节 |
联系客服