为什么会有这篇博客呢?因为最近朋友新入职了一家公司,公司要求他对现有的代码进行优化,其中就涉及到了定时任务。原有的方式是while(true) sleep,而我朋友找到了另外一种定时方式,即ScheduledExecutorService。他很疑惑,不知道原有的while(true) sleep的方式定时间隔准确度好,还是他现在找的ScheduledExecutorService这种方式定时间隔准确度好。这时他找到了我,让我帮他解答这个问题,于是就有了这篇博客。
我们分别编写while(true) sleep 定时方式的代码和ScheduledExecutorService定时方式的代码,我们分别让两种方式50毫秒执行一次,打印时间间隔
while(true) sleep 定时方式
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
while(true){
Thread.sleep(50);
long endTime = System.currentTimeMillis();
System.out.println(System.currentTimeMillis() - startTime);
startTime = endTime;
}
}
ScheduledExecutorService 定时方式
public static void main(String[] args) {
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1);
final long[] startTime = {System.currentTimeMillis()};
executorService.scheduleWithFixedDelay(()->{
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime[0]);
startTime[0] = endTime;
},50,50, TimeUnit.MILLISECONDS);
}
接着分别运行两个main方法,效果如下:
while(true) sleep 定时方式执行效果
ScheduledExecutorService 定时方式执行效果
我们能观察到while(true) sleep 定时方式最大执行间隔时间为51毫秒,而ScheduledExecutorService 定时方式最大执行间隔时间为52毫秒。
由此可以我们可以得出结论: while(true) sleep 定时方式定时时间准确度更高 。