Selon Informations sur l'état de fil Java appeler WAIT () résultera d'un fil d'aller à l'état bloqué. Cependant, ce morceau de code résultera (après avoir été appelé) dans un fil dans l'état d'attente.
class bThread extends Thread {
public synchronized void run() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
6 Réponses :
attendre, c'est quand ça ne fait rien du tout. Bloqué est quand il essaie de commencer à courir à nouveau mais n'a pas encore été autorisé. P>
Le fil attend jusqu'à ce qu'il soit notifié. Ensuite, il devient bloqué en essayant de repenser la région synchronisée jusqu'à ce que tous les autres threads soient partis. P>
Pièces pertinentes du lien que vous avez posté (à propos de l'attente): p>
Par exemple, un thread qui a appelé objet.Wait () sur un objet est en attente d'un autre thread d'appeler objet.Notify () ou objet.notifallall () sur cet objet. P> blockQuote>
et (environ bloqué): p>
Un filetage dans l'état bloqué attend un verrouillage de moniteur à [...] retentir un bloc / procédé synchronisé après l'appel de l'objet. P> blockQuote>
La dernière partie se produit lorsque le fil tente de revenir d'attente (), mais pas jusque-là. P>
Est-ce que cela signifie qu'un fil bloqué est dans une boucle pour gagner la serrure? AKA Un fil dans l'état de l'état bloqué CPU Time?
@ user2807219: Non, généralement pas. Le fil serait dans la file d'attente prête d'un mutex protégeant la région synchronisée, de la même manière que si vous appeliez une fonction synchronisée verrouillée par un autre fil. Le coût principal à craindre avec la conflit de verrouillage est typiquement que cela oblige le contexte bascule sur le programme (c'est-à-dire stocker et restaurer l'état du fil d'exécution dans la CPU), qui sont relativement coûteux.
Où l'avez-vous vu dire des choses comme ça? P>
Dans la même page que vous avez liée, thread.state , il indique clairement que P>
en attente sera après un objet.wait () p>
bloqué sera avant d'entrer synchronisé p>
Oh, je vois ce qui aurait pu vous confuser. "Bloqué => ou retentir un bloc / méthode synchronisé après avoir appelé objet.wait." .. Remarquez la «Retener un bloc synchronisé»
Le moniteur exécute un fil à la fois. En supposant que vous avez des threads T1-T10, 9 sont Lorsque l'un des threads a besoin d'informations à mettre à jour par un autre thread, vous utilisez En d'autres termes, les deux Je pense. P> bloqué code> et un exécutable code>. De temps en temps, le moniteur choisit un nouveau fil à courir. Lorsque cela se produit, le thread choisi / actuel, dite T1, va de runnable code> à bloqué code>. Ensuite, un autre fil, disons, T2, va de bloqué code> à runnable code>, devenant le fil actuel. P>
wait () code>. Dans ce cas, le thread sera signalé comme en attente code> jusqu'à ce qu'il soit notifier () code> éd. Donc, un fil qui attend ne sera pas exécuté par le moniteur jusque-là. Un exemple serait, attendez que des cases soient déchargées. Les boîtes de chargement des gars m'informeront quand cela se produira. P>
bloqué code> et attendant code> sont l'état des filetages inactifs, mais un thread code> d'attente code> ne peut pas être exécutable code> sans aller à bloqué code> en premier. En attente Code> Les threads "ne veulent pas" devenir actif, alors que bloqué code> threads "veulent", mais ne peut pas, parce que ce n'est pas leur tour. P >
Tout comme un rappel, vous devez toujours appeler attendre () à l'intérieur d'une boucle tandis que vous attendez de la condition pour entrer dans la région synchronisée / section critique. C'est parce que Java a des "bains parasites" (essentiellement un thread peut se réveiller à tout moment sans raison). P>
Cela aurait dû être un commentaire. Ça n'a rien à voir avec l'OP
Il y a une terminologie déroutante qui se passe ici.
Lorsqu'un fil d'appel attend sur un objet, il entre dans l'état d'attente.
Lorsque les threads sont en attente em> pour saisir une serrure, ils appartiennent à la attendre em> défini pour ce verrou, mais ils sont dans l'état bloqué. P>
déroutant mais en quelque sorte c'est un sens! p>
Note latérale: Vous devez associer votre appel d'attente avec une condition.