11
votes

Java Thread Wait () => Bloqué?

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();
        }
    }

}


1 commentaires

Note latérale: Vous devez associer votre appel d'attente avec une condition.


6 Réponses :


2
votes

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é.


0 commentaires

18
votes

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.

Pièces pertinentes du lien que vous avez posté (à propos de l'attente):

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.

et (environ bloqué):

Un filetage dans l'état bloqué attend un verrouillage de moniteur à [...] retentir un bloc / procédé synchronisé après l'appel de l'objet.

La dernière partie se produit lorsque le fil tente de revenir d'attente (), mais pas jusque-là.


2 commentaires

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.



4
votes

Où l'avez-vous vu dire des choses comme ça?

Dans la même page que vous avez liée, thread.state , il indique clairement que

en attente sera après un objet.wait ()

bloqué sera avant d'entrer synchronisé


1 commentaires

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é»



11
votes

Le moniteur exécute un fil à la fois. En supposant que vous avez des threads T1-T10, 9 sont bloqué et un exécutable . De temps en temps, le moniteur choisit un nouveau fil à courir. Lorsque cela se produit, le thread choisi / actuel, dite T1, va de runnable à bloqué . Ensuite, un autre fil, disons, T2, va de bloqué à runnable , devenant le fil actuel.

Lorsque l'un des threads a besoin d'informations à mettre à jour par un autre thread, vous utilisez wait () . Dans ce cas, le thread sera signalé comme en attente jusqu'à ce qu'il soit notifier () é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.

En d'autres termes, les deux bloqué et attendant sont l'état des filetages inactifs, mais un thread d'attente ne peut pas être exécutable sans aller à bloqué en premier. En attente Les threads "ne veulent pas" devenir actif, alors que bloqué threads "veulent", mais ne peut pas, parce que ce n'est pas leur tour.

Je pense.


0 commentaires

0
votes

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).


1 commentaires

Cela aurait dû être un commentaire. Ça n'a rien à voir avec l'OP



2
votes

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 pour saisir une serrure, ils appartiennent à la attendre défini pour ce verrou, mais ils sont dans l'état bloqué.

déroutant mais en quelque sorte c'est un sens!


0 commentaires