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'滾動你自己的。 –
「因爲我不知道它是怎麼做的」查看源代碼,也許? –