Java scheduled executor accuracy

前端 未结 2 2096
独厮守ぢ
独厮守ぢ 2021-02-14 05:53

There is a peculiarity that I encountered while using Java scheduled executors and was wondering if what I experienced is normal.

I need to schedule tasks that execute a

2条回答
  •  面向向阳花
    2021-02-14 06:16

    The scheduled executor service uses System.nanoTime which doesn't drift as much as currentTimeMillis. Except if you are running on an XP system with more than one CPU socket. There is a bug in XP where the OS call System.nanoTime() uses is not consistent between sockets so as the thread switches which socket it is running on, you can expect to see this jumping around. (This is not a problem on Vista/7)

    On a Linux system with one socket your program reports 0 - 3 ms drift.

    Try this program.

    public static void main(String... args) throws Exception {
        long start = System.nanoTime();
        long time = start;
        while(time < start + 3e10) {
            long now = System.nanoTime();
            if (now < time || now > time + 50000) {
                System.out.println(now - time);
                now = System.nanoTime();
            }
            time = now;
        }
    }
    

    On an i7 system I see approx 10 jumps of up to 2 ms. If I use the machine I see more. What I expect you might see is large negative and positive timings.

提交回复
热议问题