scheduleAtFixedRate
这样的工作是如何工作的?它在幕后如何工作,使用它有什么惩罚?幕后的Java ScheduledExecutorService
更具体地说,我有一个任务,我想定期运行,比如说每12小时。这段时间并不严格,所以我的第一本能是检查每个请求(tomcat服务器),如果它已经超过了上次执行任务的12个小时以上,并且如果是,执行它并重置定时器。其缺点是我必须对每个请求进行一次小小的检查,确保任务只运行一次(使用信号量或类似的东西),并且如果没有请求,任务可能无法在很长时间内执行。
scheduleAtFixedRate
可以更容易地安排一个循环任务,但由于我不知道它是如何实现的,我不知道性能的影响是什么。是否有线程不断检查任务是否由于运行?等
编辑: 在Timer.java
,有一个mainLoop
函数,在我的理解,是这样的(过于简化):
while(true) {
currentTime = System.currentTimeMillis();
if(myTask.nextExecutionTime == currentTime) myTask.run();
}
这会不会循环尝试跑得快尽可能使用一吨CPU(我知道,显然不是,但为什么)?在那里没有Thread.sleep来减慢速度。
使用像[quartz-scheduler](http://quartz-scheduler.org/)或类似的库。或者使用'ScheduledExecutorService'滚动你自己的。 –
“因为我不知道它是怎么做的”查看源代码,也许? –