我該如何製作一個循環,每秒執行約10000次(!)的間隔(!)?高頻迴路
(的continuous data acquisition from parallel port in Java重複的,但一個人的難以發現,而不是回答很老)
我看着Thread.sleep(long millis)
和Thread.sleep(long millis, int nanos)
但在Windows甲骨文的J2SE虛擬機總是睡1 millesecond長於我指定。此外,納米字段似乎四捨五入到整個毫秒(驗證,這是在Thread.java的源代碼中進行硬編碼)。
Experimantal結果:
Thread.sleep(0)
睡不(100%CPU)Thread.sleep(1)
睡在平均Thread.sleep(0, 0)
平均Thread.sleep(2)
睡2.95ms 1.95ms熟睡中不(100%CPU)Thread.sleep(0, 1)
睡眠平均1.95ms
那麼我怎樣才能讓一個循環以每秒500次以上的頻率循環呢?
編輯:我稍微放鬆了「常規」要求。如果一個延遲比另一個延遲短4倍(即,抖動不是問題),那麼這個問題不是一個大問題,只要最長的延遲是確定性的並且低於0.1ms。 (ScheduledExecutorService
的情況並非如此)
對於上下文,爲什麼你需要這樣做? –
_loop每秒鐘執行大約10000次(#)interval_爲什麼你想要每秒鐘循環次數?! –
如果您需要硬性保證,您需要考慮操作系統和代碼。告訴線程休眠1ms僅意味着(1)它進入休眠狀態,(2)它告訴其老闆(JVM或OS,取決於線程實現)在1ms過去之前不要喚醒它。但是,如果你的操作系統認爲有更重要的事情要做,你的線程*會*睡眠的時間比這個長。 – us2012