爲了同步/排隊訪問共享資源,我打算在等待循環的幫助下使用Semaphore。在等待信號量循環時SystemClock.sleep()與Thread.sleep()
爲了不碰到CPU掛鉤,我想sleep()
有點在while
循環內。
我搜索http://developer.android.com參考,並發現了兩個這樣的睡眠()函數,我很困惑,哪一個適合哪種情況:
哪一個更適合我描述的情況,爲什麼?
爲了同步/排隊訪問共享資源,我打算在等待循環的幫助下使用Semaphore。在等待信號量循環時SystemClock.sleep()與Thread.sleep()
爲了不碰到CPU掛鉤,我想sleep()
有點在while
循環內。
我搜索http://developer.android.com參考,並發現了兩個這樣的睡眠()函數,我很困惑,哪一個適合哪種情況:
哪一個更適合我描述的情況,爲什麼?
首先,你真的需要一個等待循環嗎?通常情況下,您可以使用適當的通知來解決問題,即使用Object,在其上調用wait()和notify()或其他方式(例如,在您的情況下可以使用阻塞隊列或Semaphore.acquire())。這就是說,如果你真的想要一個輪詢循環(你真的不應該這樣做,除非你必須做),我會堅持使用Thread.sleep()。正如文檔中所說,除了可以選擇中斷Thread.sleep()之外,沒有太大區別。不要放棄這樣做的選擇。
請注意,如果使用Thread.sleep(),您將必須捕獲該異常 - 如果您非常懶惰,則可能會使用SystemClock.sleep()。
事實是:
了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
他們沒有關係。這個例子只是使用睡眠來給你時間旋轉屏幕,這會導致泄漏。 – 2016-05-06 01:59:34
Thread.sleep()是由java提供的函數。此函數調用期間可能出現InterruptedException
。
SystemClock.sleep()是由android提供的函數。在調用此函數期間不會發生InterruptedException,並且中斷事件將延遲到下一個中斷事件。
SystemClock.sleep(米利斯)是一個實用功能非常類似於的Thread.sleep(米利斯),但卻忽略InterruptedException
。如果您不使用Thread.interrupt()
,則使用此功能延遲,因爲它將保留線程的中斷狀態。
結論:如果你想在android應用程序中使用SystemClock.sleep(millis)。
'SystemClock.sleep()'在UI線程中運行......我想。 – 2016-09-09 01:12:44