2011-04-29 236 views
8

为了同步/排队访问共享资源,我打算在等待循环的帮助下使用Semaphore在等待信号量循环时SystemClock.sleep()与Thread.sleep()

为了不碰到CPU挂钩,我想sleep()有点在while循环内。

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

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

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

+0

'SystemClock.sleep()'在UI线程中运行......我想。 – 2016-09-09 01:12:44

回答

18

首先,你真的需要一个等待循环吗?通常情况下,您可以使用适当的通知来解决问题,即使用Object,在其上调用wait()和notify()或其他方式(例如,在您的情况下可以使用阻塞队列或Semaphore.acquire())。这就是说,如果你真的想要一个轮询循环(你真的不应该这样做,除非你必须做),我会坚持使用Thread.sleep()。正如文档中所说,除了可以选择中断Thread.sleep()之外,没有太大区别。不要放弃这样做的选择。

请注意,如果使用Thread.sleep(),您将必须捕获该异常 - 如果您非常懒惰,则可能会使用SystemClock.sleep()。

+0

非常感谢您的及时澄清。我刚发现'Semaphore.acquire()'可能是最好的选择。 – srf 2011-04-29 22:26:14

+0

如果您使用wait(),则需要在循环中执行此操作。 wait()可以在notify()的调用之前返回。请参阅http://docs.oracle。com/javase/7/docs/api/java/lang/Object.html#wait()以获得正确的用法。 “七周内的七个并发模型:线程解开时”很好地涵盖了这个主题。 – Jonathan 2014-07-22 16:22:19

0

事实是:

了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

+0

他们没有关系。这个例子只是使用睡眠来给你时间旋转屏幕,这会导致泄漏。 – 2016-05-06 01:59:34

2

Thread.sleep()是由java提供的函数。此函数调用期间可能出现InterruptedException

SystemClock.sleep()是由android提供的函数。在调用此函数期间不会发生InterruptedException,并且中断事件将延迟到下一个中​​断事件。

SystemClock.sleep(米利斯)是一个实用功能非常类似于的Thread.sleep(米利斯),但却忽略InterruptedException。如果您不使用Thread.interrupt(),则使用此功能延迟,因为它将保留线程的中断状态。

结论:如果你想在android应用程序中使用SystemClock.sleep(millis)。