早听说Timer中是单守护进程在执行所有的任务,在调度的时候会有一些问题,现做下面例子来测试:
首先做两个简单的任务:
1. TimerJOB1
package test;
import java.util.Date;
import java.util.TimerTask;
public class TimerJOB1 extends TimerTask {
public TimerJOB1(){
super();
}
@Override
public void run() {
System.out.println("TimerJOB1:开始执行时间:"+new Date());
try {
//让线程睡30秒
Thread.sleep(1000*30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("TimerJOB1结束执行时间:"+new Date());
}
}
2.TimerJOB2
package test;
import java.util.Date;
import java.util.TimerTask;
public class TimerJOB2 extends TimerTask {
public TimerJOB2(){
super();
}
@Override
public void run() {
System.out.println("TimerJOB2:开始执行时间:"+new Date());
try {
//让线程睡30秒
Thread.sleep(1000*30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("TimerJOB2结束执行时间:"+new Date());
}
}
3. 从现在开始 1 秒钟之后,每隔 5秒执行一次 TimerJob1 ,因为TimerJob1 的执行时间是大于30s ,那么在第一次调度未完成之前第二次调度就应该开始了,会发生什么事呢?
package test;
import java.util.Timer;
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
long delay1 = 1 * 1000;
long period1 = 5*1000;
// 从现在开始 1 秒钟之后,每隔 5秒执行一次 job1
timer.schedule(new TimerJOB1(), delay1, period1);
/**
* <pre>
* 执行结果:
* TimerJOB1:开始执行时间:Fri Feb 22 15:20:32 CST 2013
TimerJOB1结束执行时间:Fri Feb 22 15:21:02 CST 2013
TimerJOB1:开始执行时间:Fri Feb 22 15:21:02 CST 2013
TimerJOB1结束执行时间:Fri Feb 22 15:21:32 CST 2013
TimerJOB1:开始执行时间:Fri Feb 22 15:21:32 CST 2013
TimerJOB1结束执行时间:Fri Feb 22 15:22:02 CST 2013
TimerJOB1:开始执行时间:Fri Feb 22 15:22:02 CST 2013
</pre>
*/
}
}
由上面可以看出,只有在当前的JOB完成之后才会执行下次job.
4. 分别调用两个job,都是每隔5秒,及第一个job第一次还没有执行完,第二个job第一次与第一个job第二次都该执行了,会一直调用一个job还是job1与job2轮换调用?
package test;
import java.util.Timer;
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
long delay1 = 1 * 1000;
long period1 = 5*1000;
// 从现在开始 1 秒钟之后,每隔 5秒执行一次 job1
timer.schedule(new TimerJOB1(), delay1, period1);
long delay2 = 1 * 1000;
long period2 = 1*5000;
// 从现在开始 1 秒钟之后,每隔 5 秒钟执行一次 job2
timer.schedule(new TimerJOB2(), delay2, period2);
/*
TimerJOB1:开始执行时间:Fri Feb 22 15:25:47 CST 2013
TimerJOB1结束执行时间:Fri Feb 22 15:26:17 CST 2013
TimerJOB2:开始执行时间:Fri Feb 22 15:26:17 CST 2013
TimerJOB2结束执行时间:Fri Feb 22 15:26:47 CST 2013
TimerJOB1:开始执行时间:Fri Feb 22 15:26:47 CST 2013
TimerJOB1结束执行时间:Fri Feb 22 15:27:17 CST 2013
TimerJOB2:开始执行时间:Fri Feb 22 15:27:17 CST 2013
TimerJOB2结束执行时间:Fri Feb 22 15:27:47 CST 2013
TimerJOB1:开始执行时间:Fri Feb 22 15:27:47 CST 2013
TimerJOB1结束执行时间:Fri Feb 22 15:28:17 CST 2013
TimerJOB2:开始执行时间:Fri Feb 22 15:28:17 CST 2013
*/
}
}