Fil de Java wait() => bloqué?
Selon Fil de Java état d'info appel wait() sera le résultat d'un thread pour aller dans l'état BLOQUÉ. Cependant ce morceau de code (après avoir appelé) dans un Thread en ATTENTE.
class bThread extends Thread {
public synchronized void run() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
J'ai obtenu quelque chose de mal? Quelqu'un peut-il expliquer ce comportement pour moi?
Toute aide serait appréciée!
Remarque: Vous devez associer votre attente téléphonique avec une condition.
OriginalL'auteur Chris | 2010-03-28
Vous devez vous connecter pour publier un commentaire.
Le thread est en ATTENTE jusqu'à ce qu'il en est informé. Ensuite, il est BLOQUÉ en essayant de rentrer dans le synchronisée de la région jusqu'à ce que tous les autres threads ont laissé.
Parties pertinentes à partir du lien que vous avez posté (à propos de l'ATTENTE):
et (à propos BLOQUÉ):
La dernière partie se produit lorsque le thread essaie de revenir de wait(), mais pas jusqu'alors.
Non, généralement pas. Le fil serait dans la file d'attente prêt d'un mutex la protection de l'synchronisée de la région, de la même manière que si vous étiez en appelant un synchronisée fonction qui est verrouillé par un autre thread. Le coût principal à vous inquiéter avec contention de verrouillage et est généralement que les forces de changements de contexte sur le programme (c'est à dire le stockage et la restauration de l'état du thread en cours d'exécution dans le CPU), qui sont relativement coûteux.
OriginalL'auteur Josef Grahn
Le moniteur exécute un seul thread à la fois. En supposant que vous avez T1-T10 fils, 9 sont
BLOCKED
et on estRUNNABLE
. Chaque fois que dans un certain temps, le moniteur choisit un nouveau thread à exécuter. Lorsque cela se produit, choisi/thread courant, dire T1, va deRUNNABLE
àBLOCKED
. Puis un autre thread, dire, T2, va deBLOCKED
àRUNNABLE
, devenant le thread courant.Lorsque l'un des fils a besoin de certaines informations pour être mis à la disposition par un autre thread, vous utilisez
wait()
. Dans ce cas, le thread sera marqué commeWAITING
jusqu'à ce qu'il estnotify()
ed. Donc, un thread est en attente ne sera pas exécuté par le moniteur jusqu'alors. Un exemple serait, attendre jusqu'à ce qu'il y a des cases à être déchargé. Le gars de chargement de boîtes de m'informer de ce qui se passe.En d'autres termes, les deux
BLOCKED
etWAITING
sont statut d'un thread inactif, mais unWAITING
fil ne peut pas êtreRUNNABLE
sans aller jusqu'àBLOCKED
premier.WAITING
fils "ne veulent pas" s'active, alors queBLOCKED
threads "veulent", mais ne le peuvent pas, parce que ce n'est pas leur tour.Je pense.
OriginalL'auteur zxcvbnm
Où l'avez-vous vu dire des trucs comme ça?
Dans la même page, vous lié, fil de discussion.état, il indique clairement que
ATTENTE sera après l'Objet.wait()
BLOQUÉ sera avant d'entrer dans synchronisé
OriginalL'auteur Yoni Roit
D'attente, c'est quand il ne fait rien du tout. Bloqué, c'est quand il essaie de commencer à courir à nouveau, mais n'a pas été autorisé à encore.
OriginalL'auteur AaronM
Il existe une certaine confusion terminologique qui se passe ici.
Lorsqu'un thread appels en attente sur un objet, il va dans l'état d'ATTENTE.
Quand les fils sont attente à s'emparer d'une serrure, ils appartiennent à la attendre ensemble pour que la serrure, mais ils sont dans l'état BLOQUÉ.
Confus, mais d'une certaine manière, cela fait sens!
OriginalL'auteur Victor Grazi
Juste pour rappel, vous devriez toujours faire appel à wait() à l'intérieur d'une boucle while en attente sur la condition pour entrer dans le synchronisée région/section critique. C'est parce que Java est "fallacieux de réveils" (essentiellement, un thread peut réveil à tout moment et pour aucune raison).
OriginalL'auteur JaHei