Timer是Jdk提供的一个定时器组件,不同于Swing中的Timer,他位于Java.util包中
Timer用后台的一个线程 定时或者重复的执行封装好的任务 任务被封装成TimerTask
TimerTask 是一个实现 Runable 接口的抽象类,把你需要执行的任务继承TimerTask即可
实例代码1. 使用Timer和TimerTask定时执行指定的任务
package jdk.timer.test; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * 一个简单的计划任务的例子 * @author Ericzhou * */ public class TestTimer { public static void main(String[] args) { System.out.println(new Date()); at(5); } public static void at(int timeout){ final Timer t = new Timer(); t.schedule(new TimerTask(){ @Override public void run() { System.out.println("time up..."+ new Date()); t.cancel(); //Run方法执行完成之后程序依然不会退出,可以采用cancel方法或者system.exit结束程序 } }, new Date(new Date().getTime()+timeout*1000)); } }
schedule() 方法用于指定timer在何时运行何种任务,他有很多重载的参数形式
可以使用delay或者精确的Date 与实现线程类似,TimerTask的实现类同样要实现run方法
我在这里使用了内部类
需要注意的是,任务执行完成后,线程并不会退出,可以有以下几种方法退出线程:
1.调用Timer的cancel() 方法
2.使用system.exit()方法
3.使timer指向新的引用
实例2.使用Timer重复执行指定任务
package jdk.timer.test; import java.util.Timer; import java.util.TimerTask; /** * @author Ericzhou */ public class TestRecycleTask { public static void main(String[] args) { Timer t = new Timer(); TimerTask task = new TimerTask(){ @Override public void run() { System.out.println("I am running..."); } }; t.schedule(task,0,3*1000); } }
与实例一的区别就在于使用了另外一个schedule方法
public void schedule(TimerTask task, long delay, long period)
在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。
固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。
task
- 所要安排的任务。
delay
- 执行任务前的延迟时间,单位是毫秒。
period
- 执行各后续任务之间的时间间隔,单位是毫秒。
IllegalArgumentException
- 如果
delay 是负数,或者
delay + System.currentTimeMillis() 是负数。
IllegalStateException
- 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。
Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。
一个Timer可以调度任意多个TimerTask,它会将TimerTask存储在一个队列中,顺序调度,如果想两个TimerTask并发执行,则需要创建两个Timer。