SystemClock.sleep() par rapport au Fil.sleep() lors de l'attente pour un sémaphore boucle
Afin de synchroniser/file d'attente d'accès à une ressource partagée, je suis sur le point d'utiliser un Sémaphore, aidé par une boucle d'attente.
Afin de ne pas courir dans la CPU de rattachement, je voudrais sleep()
un peu à l'intérieur que while
boucle.
J'ai cherché sur le http://developer.android.com de référence et a trouvé deux de ces sleep() fonctions et je suis confus quant à celui qui correspond le scénario:
Laquelle on répond mieux aux cas que j'ai décrit et pourquoi?
SystemClock.sleep()
s'exécute dans le thread de l'INTERFACE utilisateur... je pense.OriginalL'auteur srf | 2011-04-29
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, avez-vous vraiment besoin d'une boucle d'attente? Vous pouvez généralement résoudre vos problèmes à l'aide de notifications appropriées, c'est à dire ayant un Objet, l'appel de wait() et notify() ou par d'autres moyens (comme une file d'attente de blocage, ou de Sémaphore.acquire() dans votre cas).
Cela dit, si vous voulez vraiment une boucle d'interrogation (que vous ne devriez vraiment pas faire, sauf si vous le souhaitez), je collerais avec Fil.sleep(). Il n'y a pas beaucoup de différence, comme le dit la documentation, sauf que vous avez la possibilité d'interrompre un Thread.sleep(). Ne pas vous débarrasser de la possibilité de le faire.
Noter qu'en cas de Thread.sleep(), vous allez devoir attraper cette exception - si vous êtes très paresseux, vous aurez probablement s'en tenir avec SystemClock.sleep().
Semaphore.acquire()
peut être la meilleure option.Si vous êtes à l'aide de wait (), vous devez le faire dans une boucle. wait() peut retourner avant l'appel à notify(). Voir docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait() pour une utilisation correcte. "Sept Simultanéité des Modèles à Sept Semaines: Quand les Fils à Démêler" couvre ce sujet.
OriginalL'auteur EboMike
La vérité est:
Fil.sleep(n) peut être interrompue au sein d'un appel comme AsyncTask en utilisant asyncTask.annuler(vrai)
SystemClock.sleep(n) semble ignorer toute interruption de commande, donc il pourrait y avoir un risque de fuite de mémoire lorsque vous l'utilisez comme ici: https://github.com/square/leakcanary/blob/master/leakcanary-sample/src/main/java/com/example/leakcanary/MainActivity.java
OriginalL'auteur Jacky