为了同步/排队访问共享资源,我打算在等待循环的帮助下使用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