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来让之后的时间间隔追上来。

 

点击:loading..
收藏到:中国收客网
评论