SystemClock.sleep () против Thread.sleep () при ожидании цикла семафора - PullRequest
8 голосов
/ 30 апреля 2011

Чтобы синхронизировать / поставить в очередь доступ к общему ресурсу, я собираюсь использовать Семафор , которому помогает цикл ожидания.

Чтобы не допускать привязки к процессору, я бы хотел немного добавить sleep() в этот цикл while.

Я искал ссылку http://developer.android.com и нашел две такие функции sleep (), и я не понимаю, какая из них подходит для какого сценария:

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

Какой из них лучше подходит к описанному мной случаю и почему?

Ответы [ 2 ]

18 голосов
/ 30 апреля 2011

Прежде всего, вам действительно нужен цикл ожидания?Как правило, вы можете решить свои проблемы, используя надлежащие уведомления, то есть наличие объекта, вызывая wait () и notify () для него или другими способами (например, очередь блокировки или Semaphore.acquire () в вашем случае).

Тем не менее, если вы действительно хотите цикл опроса (который вы действительно не должны делать, если вам не нужно), я бы придерживался Thread.sleep ().Как говорится в документации, нет особой разницы, за исключением того, что у вас есть возможность прерывать Thread.sleep ().Не лишайте себя возможности сделать это.

Обратите внимание, что в случае Thread.sleep () вам придется перехватывать это исключение - если вы чрезвычайно ленивы, вы, вероятно,придерживаться SystemClock.sleep ().

0 голосов
/ 04 июня 2015

Истина такова:

Thread.sleep (n) может быть прерван при вызове, подобном AsyncTask, с использованием asyncTask.cancel (true)

SystemClock.sleep (n), похоже, игнорирует любую прерванную команду, поэтому может возникнуть риск утечки памяти, если вы используете ее, как здесь: https://github.com/square/leakcanary/blob/master/leakcanary-sample/src/main/java/com/example/leakcanary/MainActivity.java

...