SystemClock.sleep()与Thread.sleep()在等待信号量循环时

时间:2011-04-29 22:09:39

标签: android multithreading sleep thread-sleep

为了同步/队列对共享资源的访问,我将在等待循环的帮助下使用Semaphore

为了避免遇到CPU挂钩,我想sleep()while循环内部进行{{1}}。

我搜索了http://developer.android.com引用,发现了两个这样的sleep()函数,我很困惑哪一个符合哪种情况:

  1. Thread.sleep()
  2. SystemClock.sleep()
  3. 哪一个更适合我描述的情况以及为什么?

2 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:0)

事实是:

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

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