2017-01-24 2 views
-1

Dans quelles conditions cela peut-il se produire?Quels facteurs peuvent entraîner le transfert d'un thread de la file d'attente à la file d'attente bloquée?

Pour autant que je sais

file d'attente bloqué est un tampon entre des fils la production d'objets et des objets temps.

La file d'attente empêche les threads de rivaliser pour le même verrou.

Donc le thread obtient un verrou, mais ne peut pas être passé sur le consommateur car il est maintenant occupé?

+1

Ces deux choses ne sont pas liées les unes aux autres. 'BlockingQueues' contient des objets, pas des threads. Les threads lisent et écrivent de/vers la file d'attente, ils ne sont pas "transférés". – Kayaman

+2

Copie possible de [Différence entre les états des threads WAIT et BLOCKED] (http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states) –

+0

Vous devriez vérifier cette question: http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states –

Répondre

1

La question n'a de sens que dans l'hypothèse que cela signifie en fait « Quelles circonstances peuvent causer un fil à changement du waitétat au blockedétat? »

Il pourrait y avoir un particulier L'implémentation du planificateur maintient ces threads dans une file d'attente dédiée, obligeant à déplacer les threads d'une file vers une autre suite à ces changements d'état et influençant l'esprit de celui qui a formulé la question. Comme une note latérale, alors qu'une file d'attente de threads runnable aurait du sens, je ne peux pas imaginer une raison réelle pour mettre blocked ou waiting threads dans une file d'attente (globale).

Si cela est l'intention originale de la question, il ne doit pas être confondu avec les classes Java implémentant des files d'attente et ayant des noms similaires.

  • Un fil est à l'état blocked si elle tente d'entrer un fragment de la méthode synchronized ou un code tandis que l'autre fil possède le moniteur d'objet. A partir de là, le fil se met à l'état runnable si le propriétaire libère le moniteur et le thread bloqué réussit à acquérir le moniteur

  • Un fil est dans l'état waiting si exécute une action explicite qui ne peut procéder, si un autre thread exécute une action associée, c'est-à-dire si le thread appelle wait sur un objet, il ne peut continuer que lorsqu'un autre thread appelle notify sur le même objet. Si le thread appelle LockSupport.park(), un autre thread doit appeler LockSupport.unpark() avec ce thread comme argument. Lorsqu'il appelle join sur un autre thread, ce thread doit terminer son exécution pour terminer l'attente. L'état waiting peut également se terminer en raison de interruption ou spuriuos wakeups. Dans un cas particulier, Java considère que les threads sont dans l'état timed_waiting, s'ils ont appelé les méthodes mentionnées ci-dessus avec un délai d'expiration ou lorsqu'il exécute Thread.sleep. Cet état diffère uniquement de l'état waiting en ce que l'état peut également se terminer en raison du temps écoulé.

Lorsqu'un thread appelle wait sur un objet, il doit posséder le moniteur de l'objet, à savoir à l'intérieur d'une méthode synchronized ou bloc de code. Le moniteur est libéré lors de cet appel et réacquis à son retour. Lorsqu'il ne peut pas être réacquis immédiatement, le thread passera de l'état waiting ou timed_waiting à l'état blocked.