Thread appelant.sleep() de façon synchronisée contexte dans Java
J'ai lu que Thread.sleep()
interrompre le thread en cours d'exécution pour la période de temps spécifiée après quoi il revient à l'état exécutable attendant c'est au tour de course.
Aussi, s'il est appelé à partir de synchronized
contexte, sleep()
ne pas libérer le verrou qu'il détient. Donc, je me demandais quand il va libérer le verrou. Si le fil, à mettre sur le sommeil, ne fait jamais la chance de courir donc il sera toujours garder la serrure avec lui-même et la façon dont les autres threads arrive à entrer dans synchronisé méthodes/bloc.
Je ne suis pas sûr si je suis poser des question valable. Mais s'il vous plaît, aidez-moi.
OriginalL'auteur Anand | 2012-05-19
Vous devez vous connecter pour publier un commentaire.
Il va libérer le verrou à la sortie de la
synchronized
bloc, et pas plus tôt.Tout simplement, les autres threads ne sera pas en mesure de saisir le code synchronisé sur le même objet que le thread en sommeil.
Pour résumer, l'appel de
Thread.sleep()
à partir d'unsynchronized
bloc est probablement pas une bonne idée.Thread.sleep()
est probablement pas une bonne idée. Si il y a quelque chose que vous pouvez faire maintenant, vous devriez le faire maintenant. Si vous avez à attendre que quelque chose avant qu'il n'y a rien que vous pouvez faire, vous devez attendre que quelque chose plutôt que de dormir.Je suis d'accord. Bien qu'il existe des utilisations légitimes pour
Thread.sleep()
, il est souvent utilisé là où il ne devrait pas l'être.Bien expliqué, mais en disant: "Pour résumer, le Thread appelant.sleep() à partir d'un bloc synchronisé n'est probablement pas une bonne idée." est aller trop loin. Parfois, vous voulez attendre et de garder la serrure.
Si vous êtes en attente pour le téléphone à anneau, vous devez attendre que le téléphone sonne. Vous ne devriez pas aller dormir pendant 4 secondes, puis vérifiez si le téléphone a sonné pendant que vous étiez endormi. Si il y a quelque chose que vous êtes en attente, vous devez attendre que quelque chose plutôt que de dormir.
Le code qui permet les appels à l'API doit utiliser une minuterie pour déclencher un appel à
notify
. Le code qui permet les appels de l'API doit être en attente de l'autorisation à l'aide dewait
. Même si vous combinez ces deux fonctions en un seul morceau de code, l'opération sera déclenché par le timer, donc il n'y a pas besoin d'appelersleep
. Plutôt que d'avoir un fil d'attendre que quelque chose se passe afin qu'il puisse faire un travail, avoir la chose se passe de provoquer le travail à faire pour qu'il ne doit rien à attendre.OriginalL'auteur NPE
Si vous utilisez
Object.wait
au lieu deThread.sleep
, de la serrure de la synchronisés seront libérées.OriginalL'auteur nosid