幕后的Java ScheduledExecutorService

时间:2015-08-18 21:13:26

标签: java jvm

scheduleAtFixedRate之类的内容如何运作?它是如何在幕后工作的,使用它会受到惩罚吗?

更具体地说,我有一项任务,我想定期运行,比如每12小时一次。这段时间根本不严格,所以我的第一直觉就是检查每个请求(tomcat服务器),如果它自上次执行任务以来已经超过> 12小时,如果是,则执行它并重置计时器。这样做的缺点是我必须对每个请求进行一次小的检查,确保任务只运行一次(使用信号量或类似的东西),如果没有请求,任务可能不会在很长时间内执行。 / p>

scheduleAtFixedRate可以更轻松地安排定期任务,但由于我不知道它是如何做到的,我不知道性能影响是什么。是否有线程不断检查任务是否应该运行?等

修改Timer.java中,有一个mainLoop函数,根据我的理解,这个函数是这样的(过于简化):

while(true) {
    currentTime = System.currentTimeMillis();
    if(myTask.nextExecutionTime == currentTime) myTask.run();
}

这个循环不会尝试尽可能快地运行并使用大量的CPU(我知道,显然不是,但为什么)?那里没有Thread.sleep可以减慢速度。

1 个答案:

答案 0 :(得分:1)

如果您想了解它的工作原理,可以阅读代码。

在CPU和内存方面存在使用ScheduledExecutorService的开销,但是在小时,分钟,秒甚至毫秒的范围内,它可能不会令人担忧。如果你的任务在微秒范围内运行,我会考虑更轻量级的东西。

简而言之,开销可能太小而无法让您注意到。它给你带来的好处是易于使用,它很可能是值得的。