2011-04-29 12 views
8

Para sincronizar/poner en cola el acceso a un recurso compartido, estoy a punto de usar un Semaphore, ayudado por un bucle de espera.SystemClock.sleep() vs. Thread.sleep() mientras esperaba un bucle de semáforo

Con el fin de no toparse con vinculación CPU, me gustaría sleep() un poco dentro de esa while bucle.

He buscado en la referencia http://developer.android.com y encontraron dos tales sueño() funciones y yo estoy confundido en cuanto a cuál se adapta a qué escenario:

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

la que uno se adapte mejor el caso que describí y por qué?

+0

'SystemClock.sleep()' se ejecuta en el hilo de la interfaz de usuario ... creo. –

Respuesta

18

Antes que nada, ¿realmente necesitas un ciclo de espera? Por lo general, puede resolver sus problemas utilizando las notificaciones adecuadas, es decir, tener un Objeto, llamar a wait() y notify() en él u otros medios (como una cola de bloqueo o Semaphore.acquire() en su caso).

Dicho esto, si realmente quieres un ciclo de sondeo (que no deberías hacer a menos que sea necesario), me quedaría con Thread.sleep(). No hay mucha diferencia, como dice la documentación, excepto que tiene la opción de interrumpir un Thread.sleep(). No te deshagas de la opción de hacerlo.

Tenga en cuenta que en el caso de Thread.sleep(), tendrá que atrapar esa excepción; si es extremadamente vago, probablemente se quede con SystemClock.sleep().

+0

Gracias por esta gran y oportuna aclaración. Acabo de descubrir que 'Semaphore.acquire()' puede ser la mejor opción. – srf

+0

Si está utilizando wait(), debe hacerlo en un bucle. wait() puede regresar antes de la llamada a notify(). Ver http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html # wait() para el uso correcto. "Siete modelos de simultaneidad en siete semanas: When Threads Unravel" cubre bien este tema. – Jonathan

0

La verdad es:

Thread.sleep (n) podría interrumpirse dentro de una llamada como AsyncTask utilizando asyncTask.cancel (verdadero)

SystemClock.sleep (n) parece ignorar cualquier comando interrumpido , por lo que podría ser un riesgo de pérdida de memoria cuando la utilice similar como aquí: https://github.com/square/leakcanary/blob/master/leakcanary-sample/src/main/java/com/example/leakcanary/MainActivity.java

+0

No están relacionados. Ese ejemplo simplemente usa un sueño para darle tiempo a rotar la pantalla, lo que causa una fuga. –

2

Thread.sleep() es una función proporcionada por java. InterruptedException puede ocurrir durante la llamada de esta función.

SystemClock.sleep() es una función proporcionada por android. InterruptedException no ocurre durante la llamada a esta función, y el evento de interrupción se retrasará hasta el siguiente evento de interrupción.

SystemClock.sleep (millis) es una función de utilidad muy similar a Thread.sleep (millis), pero ignora InterruptedException. Utilice esta función para retrasos si no usa Thread.interrupt(), ya que preservará el estado interrumpido del hilo.

Conclusión: Si desea mantener una aplicación Android Vaya con SystemClock.sleep (Millis).