Quelqu'un peut-il m'expliquer s'il vous plaît la différence entre les états de threads Sleeping
, Wait
, Park
et Monitor
dans VisualVM.
Voici ce que j'ai trouvé:
Running
: le fil est toujours en cours d'exécution.Sleeping
: le thread est en veille (la méthode yield () a été appelée sur l'objet thread)Wait
: le thread a été bloqué par un mutex ou une barrière et attend qu'un autre thread libère le verrou.Park
: les threads parqués sont suspendus jusqu'à ce qu'ils obtiennent un permis. La suppression d'un fil de discussion est généralement effectuée en appelant la méthode unpark () sur l'objet de filMonitor
: les threads attendent qu'une condition devienne vraie pour reprendre l'exécution
Ce que je suis incapable de comprendre, c'est le parc d'état, qu'est-ce qui suspend le fil? Comment détecter dans le code ce qui a amené le thread à suspendre son exécution?
Quelqu'un peut-il me guider s'il vous plaît à cet égard.
Merci.
J'ai utilisé google et la toute première page qui a été réalisée avait un très joli diagramme qui décrit à peu près tout ce que vous voulez/voulez savoir. La prochaine fois que cela vaut la peine d'essayer Google pour ce type de questions.
1) Nouveau
Le thread est dans un nouvel état si vous créez une instance de la classe Thread mais avant l'appel de la méthode start ().
2) Runnable
Le thread est à l'état exécutable après l'appel de la méthode start (), mais le planificateur de thread ne l'a pas sélectionné comme thread en cours d'exécution.
3) courir
Le thread est en cours d'exécution si le planificateur de thread l'a sélectionné.
4) attente minutée
Attente programmée est l’état d’un thread en attente avec un délai d’attente spécifié. Un thread est dans l'état d'attente programmé en raison de l'appel d'une des méthodes suivantes avec un délai d'attente positif spécifié:
5) non exécutable (bloqué)
Il s'agit de l'état dans lequel le thread est toujours actif, mais n'est actuellement pas éligible pour être exécuté.
6) Terminé
Un thread est à l'état arrêté ou mort lorsque sa méthode run () se ferme.
En esperant que cela répond à votre question :).
Parking:
Désactive le thread actuel aux fins de planification, sauf si l'autorisation est disponible.
Les threads sont en cours de stationnement ou suspendus si vous souhaitez l'appeler de cette façon car il ne dispose pas d'une autorisation d'exécution. Une fois la permission accordée, le fil de discussion sera récupéré et exécuté.
Les permis de LockSupport sont associés à des threads (c’est-à-dire que le permis est attribué à un thread particulier) et ne s’accumulent pas (c’est-à-dire qu’il ne peut y avoir qu’un seul permis par thread; lorsque le thread le consomme, il disparaît).
VisualVM mappe l'état Java (comme décrit dans la réponse de @ Maciej) à l'état présenté dans son interface utilisateur comme suit:
BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie
Sleeping
et Park
sont des cas spécifiques d'attente (temporisée):
Sleeping: specifically waiting in Thread.sleep().
Park: specifically waiting in Sun.misc.Unsafe.park() (presumably via LockSupport).
(Le mappage est effectué dans ThreadMXBeanDataManager.Java
.)
Une brève discussion (et ne faisant pas autorité) de Java peut être trouvée ici .
Édité pour ajouter:
Il est également intéressant de noter que les threads bloquant les appels aux méthodes natives apparaissent dans la machine virtuelle Java sous la forme RUNNABLE
et sont donc signalés par VisualVM sous la forme Running
(et consomment 100% de l'UC).