2011-04-29 212 views
8

爲了同步/排隊訪問共享資源,我打算在等待循環的幫助下使用Semaphore在等待信號量循環時SystemClock.sleep()與Thread.sleep()

爲了不碰到CPU掛鉤,我想sleep()有點在while循環內。

我搜索http://developer.android.com參考,並發現了兩個這樣的睡眠()函數,我很困惑,哪一個適合哪種情況:

  1. Thread.sleep()
  2. SystemClock.sleep()

哪一個更適合我描述的情況,爲什麼?

+0

'SystemClock.sleep()'在UI線程中運行......我想。 – 2016-09-09 01:12:44

回答

18

首先,你真的需要一個等待循環嗎?通常情況下,您可以使用適當的通知來解決問題,即使用Object,在其上調用wait()和notify()或其他方式(例如,在您的情況下可以使用阻塞隊列或Semaphore.acquire())。這就是說,如果你真的想要一個輪詢循環(你真的不應該這樣做,除非你必須做),我會堅持使用Thread.sleep()。正如文檔中所說,除了可以選擇中斷Thread.sleep()之外,沒有太大區別。不要放棄這樣做的選擇。

請注意,如果使用Thread.sleep(),您將必須捕獲該異常 - 如果您非常懶惰,則可能會使用SystemClock.sleep()。

+0

非常感謝您的及時澄清。我剛發現'Semaphore.acquire()'可能是最好的選擇。 – srf 2011-04-29 22:26:14

+0

如果您使用wait(),則需要在循環中執行此操作。 wait()可以在notify()的調用之前返回。請參閱http://docs.oracle。com/javase/7/docs/api/java/lang/Object.html#wait()以獲得正確的用法。 「七週內的七個併發模型:線程解開時」很好地涵蓋了這個主題。 – Jonathan 2014-07-22 16:22:19

0

事實是:

了Thread.sleep(N)可以通過使用asyncTask.cancel(真)一樣的AsyncTask在一個呼叫中打斷

SystemClock.sleep(N)似乎忽略任何中斷的命令,因此當你使用類似於這裏的內存時可能會出現內存泄漏的風險:https://github.com/square/leakcanary/blob/master/leakcanary-sample/src/main/java/com/example/leakcanary/MainActivity.java

+0

他們沒有關係。這個例子只是使用睡眠來給你時間旋轉屏幕,這會導致泄漏。 – 2016-05-06 01:59:34

2

Thread.sleep()是由java提供的函數。此函數調用期間可能出現InterruptedException

SystemClock.sleep()是由android提供的函數。在調用此函數期間不會發生InterruptedException,並且中斷事件將延遲到下一個中​​斷事件。

SystemClock.sleep(米利斯)是一個實用功能非常類似於的Thread.sleep(米利斯),但卻忽略InterruptedException。如果您不使用Thread.interrupt(),則使用此功能延遲,因爲它將保留線程的中斷狀態。

結論:如果你想在android應用程序中使用SystemClock.sleep(millis)。