scheduleAtFixedRate之类的东西如何工作?它在后台如何工作?使用它会受到惩罚吗?

更具体地说,我有一个要定期运行的任务,例如每12小时运行一次。这个时间段并不严格,所以我的第一个直觉是检查每个请求(tomcat服务器)是否距离任务上次执行已超过12小时,如果是,则执行该任务并重置计时器。这样做的缺点是我必须对每个请求进行一次小的时间检查,确保任务仅运行一次(使用信号量或类似方法),并且如果没有请求,任务可能不会长时间执行。

scheduleAtFixedRate使安排重复任务变得更加容易,但是由于我不知道它是如何执行的,因此我不知道对性能的影响。是否有一个线程不断检查任务是否应运行?等等

编辑:
Timer.java中,有一个mainLoop函数,据我所知,是这样的(过于简化):

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


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

最佳答案

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

使用ScheduledExecutorService会产生CPU和内存方面的开销,但是就小时,分钟,秒甚至毫秒的规模而言,它可能无法正常工作。如果您的任务在微秒内运行,我会考虑减轻重量。

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

10-05 18:24