wait (long timeout) dans une boucle while?
J'ai lu que vous êtes censé mettre Object.wait()
appels en Java dans une boucle while. La raison en est que ce fil peut être réveillé et a la condition que vous avez été en attente pour informer sur les est toujours false(fausse réveil).
Ce sujet Object.wait(long timeout)
. Ici, vous ne voulez pas de boucle sur l'état puisque vous voulez à l'heure après le laps de temps spécifié. Mais si vous ne le mettez pas dans une boucle, alors comment pouvez-vous vous assurer qu'il ne sera pas réveillé tôt?
source d'informationauteur AFS
Vous devez vous connecter pour publier un commentaire.
C'est une carence en Java OMI bien que c'est peut-être une carence de la sous-tendent le support des threads dans les différents OS des variantes. Je soupçonne Java sait si l'attente a expiré ou non, mais il n'existe aucun moyen pour l'appelant à la figure sans re-test de la condition et de tester le temps. Laid.
De sorte que vous aurez besoin de mettre de la
wait(long timeout)
dans unwhile
boucle et aussi test pour voir si le temps est passé le délai d'attente. Je ne connais pas d'autre moyen pour accomplir cette tâche.c'est parce que java a Mesa style moniteurs au lieu de Hoare style moniteurs. Si vous avez besoin de mettre d'attendre dans une boucle while.
S'il vous plaît recherche de la chaîne "Pour cette raison, il est généralement nécessaire d'entourer chaque opération d'attente dans une boucle comme ceci", le prédécesseur de la page web,
http://en.wikipedia.org/wiki/Monitor_(synchronisation)#Nonblocking_condition_variables
.si elle avait été un Hoare style moniteurs vous de mettre votre attente dans le si. Je vais bientôt ajouter des détails de Mesa moniteurs. Ce n'est pas une carence en Java. Les deux types de moniteurs ont des avantages et des inconvénients.
Appel d'attendre dans une boucle n'est pas seulement la manipulation de l'occasionnel fallacieux de réveil. En général (non-toy exemple) cas où plusieurs threads sont en soutenant de la serrure, à la fois qu'un thread se réveille d'attendre que toutes les vérifications qu'il fait avant d'attente ne sont pas suffisants pour prédire l'état de l'objet est dans. Le thread en attente qui a renoncé à la serrure, donc tout ce qui pourrait être arrivé depuis, et de plus il n'y a rien atomique sur la façon dont les notifications de travail, juste parce que vous avez notifié ne veut pas dire un autre thread n'a pas à se faufiler dans le temps entre le moment où la notification a été faite et la notifié fil acquis de nouveau la serrure.
Fondamentalement que vous attendez dans une boucle car vous avez besoin de vérifier l'état actuel avec le verrou, afin d'être en mesure de dire ce qu'il se passe. Avoir un délai d'attente ne change pas. Un délai d'attente est un mécanisme de sécurité de sorte que si une notification est raté le filet de ne pas s'accrocher éternellement. Si le temps d'attente à la sortie n'est habituellement pas d'action spécifique nécessaire, il suffit d'acquérir le verrou, passez à le corps de la boucle, et de vérifier thr condition, comme d'habitude.
Et ce n'est pas Java de la faute, c'est la façon dont les pthreads travail.