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
.
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
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) –
Vous devriez vérifier cette question: http://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states –