SystemClock.sleep() 和 Thread.sleep() 在等待信号量循环中的区别

11
为了同步/排队访问共享资源,我将使用Semaphore和等待循环。为了避免CPU占用过高,在while循环中我想要使用sleep()

我在http://developer.android.com参考文档中搜索到两个这样的sleep()函数,我不确定哪一个适用于该情况:

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

哪一个更适合我描述的情况,为什么?


SystemClock.sleep()在UI线程中运行... 我认为。 - Yousha Aleayoub
@YoushaAleayoub,你错了。文档中没有提到它在UI线程上运行。这是误导性的。 - Fredrick Gauss
@FredrickGauss 嗯,这是4年前的事情,我当时做错了...所以,只有在非UI线程中调用才可以。 - Yousha Aleayoub
2个回答

19

首先,你真的需要一个等待循环吗?通常可以使用适当的通知来解决问题,例如使用 Object,在其上调用 wait()notify() 或其他方法(如阻塞队列或在您的情况下使用 Semaphore.acquire())。

话虽如此,如果你真的想要一个轮询循环(除非必须,否则你确实不应该这样做),我建议使用 Thread.sleep()。正如文档所说,两者没有太大区别,只是你有中断 Thread.sleep() 的选项。不要放弃这个选项。

请注意,在使用 Thread.sleep() 的情况下,你需要捕获那个异常- 如果你非常懒,你可能会坚持使用 SystemClock.sleep()


感谢这个明确而及时的解释。我刚刚发现Semaphore.acquire()可能是最好的选择。 - srf
如果您正在使用wait(),则需要在循环中这样做。wait()可能会在调用notify()之前返回。请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()以获取正确的用法。《七周七并发模型:当线程解开时》很好地涵盖了这个主题。 - Jonathan

1

它们之间没有关联。那个例子只是使用了一个睡眠函数,目的是给你足够的时间来旋转屏幕,但这会导致内存泄漏。 - Matt Quigley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接