11

为了同步/排队访问共享资源,我将使用Semaphore,并借助等待循环。

为了不遇到 CPU 挂钩,我想在那个循环中sleep()稍微深入一点。while

我搜索了http://developer.android.com参考,发现了两个这样的 sleep() 函数,我很困惑哪一个适合哪种场景:

  1. 线程.sleep()
  2. SystemClock.sleep()

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

4

2 回答 2

19

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

也就是说,如果你真的想要一个轮询循环(除非你必须这样做,否则你真的不应该这样做),我会坚持使用Thread.sleep(). 正如文档所说,没有太大区别,只是您可以选择中断Thread.sleep(). 不要让自己摆脱这样做的选择。

请注意,如果是Thread.sleep(),您将不得不捕获该异常 - 如果您非常懒惰,您可能会坚持使用SystemClock.sleep().

于 2011-04-29T22:17:00.500 回答
0

事实是:

Thread.sleep(n) 可以通过使用 asyncTask.cancel(true) 在 AsyncTask 之类的调用中被中断

SystemClock.sleep(n) 似乎忽略了任何中断的命令,因此当您像这里一样使用它时可能存在内存泄漏的风险:https ://github.com/square/leakcanary/blob/master/leakcanary-sample/ src/main/java/com/example/leakcanary/MainActivity.java

于 2015-06-03T23:36:30.493 回答