Timer和TimeTask简介
Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import public class MyTask extends TimerTask { private int id public MyTask id { this = id } public void run { System + id + ":正在执行" //System.gc(); } } |
然后主程序代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import import public class Test { public static void main args { Timer = new Timer timer MyTask 5000 MyTask = new MyTask timer 1000 3000 // 1秒后启动任务,以后每隔3秒执行一次线程 Date = new Date timer MyTask new Date + 1000 // 以date为参数,指定某个时间点执行线程 // timer.cancel(); // secondTask.cancel(); System } } |
Timer里面有4个schedule重载函数,而且还有两个scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
使用scheduleAtFixedRate的话,Timer会尽量的让任务在一个固定的频率下运行。例如:在上面的例子中,让secondTask在1秒钟后,每3秒钟执行一次,但是因为java不是实时的,所以,我们在上个程序中表达的原义并不能够严格执行,例如有时可能资源调度紧张4秒以后才执行下一次,有时候又3.5秒执行。如果我们调用的是scheduleAtFixedRate,那么Timer会尽量让你的secondTask执行的频率保持在3秒一次。运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,secondTask执行一次,因为系统繁忙,之后的3.5秒后secondTask才得以执行第二次,然后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。
Timer终止的问题:
默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。可以通过以下3种方法终止一个timer线程:
(1)调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
(2)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;
(3)调用System.exit方法,使整个程序(所有线程)终止。
TimerTask也有cancel方法。
上面所说的“只要一个程序的timer线程在运行,那么这个程序就会保持运行”。那么反过来,如果Timer里的所有TimerTask都执行完了,整个程序会退出吗,经测试是否定的,例如上面的测试代码,如果只加第一个TimerTask在Timer中执行:
timer.schedule(new MyTask(1), 5000);// 5秒后启动任务
那么5秒以后,其实整个程序还是没有退出,Timer会等待垃圾回收的时候被回收掉然后程序会得以退出,但是多长时间呢?在TimerTask的run函数执行完以后加上System.gc();就可以了。
Java定时调度 Timer类和TimerTask类
Timer类是一种线程设施,可以用来实现某一个时间或某一段时间后安排某一个任务执行一次或定期重复执行。该功能和TimerTask配合使用。TimerTask类用于实现由Timer安排的一次或重复执行的某个任务。每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则会延迟后续的任务执行。
Timer类方法摘要
Java代码
- void cancel()
- 终止此计时器,丢弃所有当前已安排的任务。
- int purge()
- 从此计时器的任务队列中移除所有已取消的任务。
- void schedule(TimerTask task, Date time)
- 安排在指定的时间执行指定的任务。
- void schedule(TimerTask task, Date firstTime, long period)
- 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
- void schedule(TimerTask task, long delay)
- 安排在指定延迟后执行指定的任务。
- void schedule(TimerTask task, long delay, long period)
- 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
- void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
- 安排指定的任务在指定的时间开始进行重复的固定速率执行。
- void scheduleAtFixedRate(TimerTask task, long delay, long period)
- 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
TimerTask类方法摘要
Java代码
- boolean cancel()
- 取消此计时器任务。
- abstract void run()
- 此计时器任务要执行的操作。
- long scheduledExecutionTime()
- 返回此任务最近实际 执行的已安排 执行时间。
TimerTask类是个抽象类,如果要用该类,需要自己建立一个类来继承此类,并实现其中的抽象方法。
Java代码 package zzs.time.demo;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.TimerTask;
- public class MyTask extends TimerTask {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- SimpleDateFormat simpleDateFormat=null;
- simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
- System.out.println("当前的系统时间为:"+simpleDateFormat.format(new Date()));
- }
- }
Java代码
- package zzs.time.demo;
- import java.util.Timer;
- public class TestTask {
- /**
- * @param args
- * @throws InterruptedException
- */
- public static void main(String[] args) throws InterruptedException {
- // TODO Auto-generated method stub
- Timer timer=new Timer();
- MyTask myTask=new MyTask();
- timer.schedule(myTask, 1000, 2000);
- // Thread.sleep(5000);
- //timer.cancel();
- }
- }
运行结果:
Java代码
- 当前的系统时间为:2011-07-10 15:37:44:831
- 当前的系统时间为:2011-07-10 15:37:46:786
- 当前的系统时间为:2011-07-10 15:37:48:786
- 当前的系统时间为:2011-07-10 15:37:50:786
- 当前的系统时间为:2011-07-10 15:37:52:786
- 当前的系统时间为:2011-07-10 15:37:54:786