java.util.Timer行为测试
2023-9-12 16:24为了想确定timer在时间间隔内没有执行完成,执行间隔会变成什么样,就写了如下测试代码测试一下
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTest { private int counter = 0; public void run() { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println(new Date() + " timer begin to exec"); try { int ms = ((counter++ % 4) + 3) * 1000; System.out.println("will sleep ms " + ms); Thread.sleep(ms); } catch (InterruptedException ex) { System.out.println(ex); } System.out.println(new Date() + " timer exec ends"); } }, 5000, 5000); } }
执行后结果如下
Tue Sep 12 16:10:11 CST 2023 timer begin to exec will sleep ms 3000 Tue Sep 12 16:10:14 CST 2023 timer exec ends Tue Sep 12 16:10:16 CST 2023 timer begin to exec will sleep ms 4000 Tue Sep 12 16:10:20 CST 2023 timer exec ends Tue Sep 12 16:10:21 CST 2023 timer begin to exec will sleep ms 5000 Tue Sep 12 16:10:26 CST 2023 timer exec ends Tue Sep 12 16:10:26 CST 2023 timer begin to exec will sleep ms 6000 Tue Sep 12 16:10:32 CST 2023 timer exec ends Tue Sep 12 16:10:32 CST 2023 timer begin to exec will sleep ms 3000 Tue Sep 12 16:10:35 CST 2023 timer exec ends Tue Sep 12 16:10:37 CST 2023 timer begin to exec will sleep ms 4000 Tue Sep 12 16:10:41 CST 2023 timer exec ends Tue Sep 12 16:10:42 CST 2023 timer begin to exec will sleep ms 5000 Tue Sep 12 16:10:47 CST 2023 timer exec ends Tue Sep 12 16:10:47 CST 2023 timer begin to exec will sleep ms 6000 Process finished with exit code 130
这说明
1. timer是单线程在执行
2. timer的时间间隔内,动作没有执行完,那下个时间间隔会立即启动,比如测试中的时间间隔5s,一次代码执行了6s,那么这个6s执行完成后,下个时间间隔动作立即执行,不会再等4s
3. 一个时间间隔多占用的时间不会在之后的时间间隔中追回。比如间隔5s执行一次,某次执行占用了6s,下次如果执行就算少于4s,比如示例中的3s,那也不会造成下次间隔变为4s来让之后的时间间隔追上来。