2014-04-10 37 views
2

我已經開始使用固定速率的計時器。當用戶更改系統時間時,任務會連續執行。它不考慮週期時間。如何管理這個。定時器在java中意外觸發

timer.scheduleAtFixedRate(task, delay, period); 

注意:現在系統時間是當前時間。時間是30秒。現在用戶將系統時間從當前時間改爲10分鐘。那時定時器任務不考慮週期。在一秒鐘內執行任務20次。

當我使用

timer.schedule(task, delay, period); 

,而不是

timer.scheduleAtFixedRate(task, delay, period); 

任務正常工作。如果我將系統時間從現在起改變爲10分鐘,則任務不會執行...

如何解決此問題? :(

+0

請顯示一個簡短但完整的程序來演示問題。例如,當它實際上以毫秒爲單位時,您是否可能期望以秒爲單位? –

+0

你是說''任務執行不管'延遲'和'期間'? – txtechhelp

+0

是的。任務不關於延遲和期限 –

回答

1

看看this堆棧溢出的答案;長話短說,使用scheduleAtFixedRate將排隊你安排的任務,並相對於任務第一次排隊的系統時間觸發它們;如果有什麼應該延遲這些任務所以在你如何改變系統時間到+10分鐘使得事件觸發20次的例子中,因爲考慮到你的週期是30秒(1米/秒) 2 = 30s,10m * 2 = 20個事件)

使用schedule函數有類似的問題,除非它不播放'追趕';如果您有一個計時器設置爲每30秒啓動一次,則更改系統時間僅在定時器之後10秒鐘到+10分鐘已經開始,您的第一個事件將觸發,然後繼續等待30秒延遲並再次觸發(除非您再次更改系統時鐘)。

如果你想要一些獨立於系統時間的東西,你需要單調的時鐘值。據我所知,Java API並不直接包含任何單調計時器(出於多種原因),但這並不妨礙您自己實現一個計時器(儘管代價是可能浪費執行定時器類代碼中的執行時間)。 Here's a Stack Overflow關於此問題以及Google Group討論帖子。

如果您真的很難使用單調計時器,您可能會使用POSIX API's並執行一些Java-> C JNI工作。

我希望能夠幫到(至少指出一個堅實的方向)。