對於模擬我不會試圖在實時模擬,因爲這不會給你重複的結果開始校準步驟。即你不能測試你的模擬。
相反,我會用驅動的數據,模擬時鐘,並儘可能快地運行一切。這使您可重複的結果,並允許您模擬快於實時(例如2倍至100倍速度)
懷疑一個線程需要大約10微秒。沒有意義的嘗試暫停一個線程更少的時間,這一點。
要想在短時間內忙着等待,可以試試。
long start = System.nanotime();
while(start + delay >= System.nanoTime());
注:爲@EugeneBeresovsky的意見,你的機器已經運行了292年這可能溢出等你以後可能會選擇寫爲
while(System.nanoTime() - start < delay);
這將罰款小於292的延遲年代替。您可以使用System.currentTimeMillis()來延長更長時間。
但是,即使這樣也不可靠,因爲System.nanoTime()在CentOS 5.x上可能需要長達300 ns,所以調用它兩次將花費比100 ns更長的時間。此外,許多操作系統的分辨率只有1000納秒(1微秒),所以無論您尋找什麼延遲,該環路都會等待1微秒。
相反,你可以做的是忙於等待一個短的循環,這是沒有優化的方式。
對於100 ns的延遲,我懷疑最好是忙於等待你正在等待的任何東西,而不是創建一個單獨的忙碌循環。
你有特別的理由說明你爲什麼要這樣做?如果是這樣,它可能以不同的方式解決... – 2012-07-16 05:39:00
這是一個不尋常的要求。這聽起來像你需要[退出策略](http://en.wikipedia.org/wiki/Exponential_backoff)或類似的。 – Bohemian 2012-07-16 05:50:40
@ FY FYI,這是煩人的發佈問題在計算器上,並有回答質疑你,而不是提供一個答案。想要這麼做的原因有很多,多年來已經出現在項目中。一個實際的原因是在硬件記錄音頻的應用程序中保持實時行爲,因爲硬件可能表現不一致,或者您可能爲了測試目的而模擬硬件行爲。 – EntangledLoops 2015-10-22 14:50:09