1

因爲我每秒都在執行時間關鍵型任務,所以我比較了幾種方法來找到確保我的任務在固定時間步驟中真正執行的最佳方法。在計算所有方法的誤差標準推導之後,似乎使用方法scheduledExecutorService.scheduleAtFixedRate()可以獲得最佳結果,但我不知道爲什麼會這樣。方法scheduledExecutorService.scheduleAtFixedRate()如何確保實時執行?

有沒有人知道該方法內部工作?例如,與簡單的sleep()相比,它如何確保引用的任務在固定的時間步驟中真正執行?

回答

4

「正常」的Java VM不能對執行時間(以及由此也關於調度時間)做出任何硬實時保證。如果你確實需要實時保證,你應該看看像Java RTS這樣的實時虛擬機。當然你也需要一個實時操作系統。

關於與Thread.sleep()的比較:scheduledExecutorService.scheduleAtFixedRate()相對於Thread.sleep()的(天真)使用的優點是它不受計劃任務的執行時間的影響。請參閱ScheduledFutureTask.runPeriodic()瞭解如何實現。

1

您可以看看ScheduledThreadPoolExecutor.java的OpenJDK7實現,它是實現ScheduledExecutorService接口的唯一類。

但據我所知在ScheduledExecutorService中有關於精度的保證。因此,即使您的衡量標準顯示這是嚴重錯誤,但如果您切換到其他平臺,vm或jdk,情況可能並非如此。

+2

因爲這個類經常在內部使用其他類,所以我很難遵循它。但我認爲這可能是相關的: 我發現任務被放入一個PriorityQueue中,它可能按優先級排序任務,這意味着它們的預期執行時間。因此,似乎確實沒有實時保證。 但爲什麼這種方法比睡眠(速度)更好?也許這個隊列能夠以比例如垃圾收集器更高的優先級運行線程,以便能夠近乎實時地執行任務? – Markus 2009-10-03 15:10:01

+0

你的意思是「據我所知沒有任何保證」? – 2012-01-16 22:00:42

相關問題