【问题标题】:SystemClock.sleep() vs. Thread.sleep() while waiting for a semaphore loop等待信号量循环时的 SystemClock.sleep() 与 Thread.sleep()
【发布时间】:2011-04-29 22:09:39
【问题描述】:

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

为了不遇到 CPU 挂钩问题,我想在 while 循环中稍微添加一点 sleep()

我搜索了http://developer.android.com 参考并找到了两个这样的 sleep() 函数,我不知道哪个适合哪个场景:

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

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

【问题讨论】:

  • SystemClock.sleep() 在 UI 线程中运行...我认为。
  • @YoushaAleayoub,你错了。文档中没有提到它在 UI 线程上运行。这是误导。
  • @FredrickGauss 好吧,这是 4 年前的事了,我错了......所以是的,只有从非 UI 线程调用。

标签: android multithreading sleep thread-sleep


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您及时的澄清。我刚刚发现Semaphore.acquire() 可能是最好的选择。
  • 如果你使用 wait() 你需要在一个循环中这样做。 wait() 可以在调用 notify() 之前返回。有关正确用法,请参阅docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()。 “七周内的七个并发模型:当线程解开时”很好地涵盖了这个主题。
【解决方案2】:

事实是:

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

【讨论】:

  • 它们不相关。该示例只是使用睡眠来让您有时间旋转屏幕,这会导致泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2012-12-08
  • 2014-10-21
  • 2014-09-11
  • 2017-11-02
相关资源
最近更新 更多