VisualVM-États des Threads
Quelqu'un Peut-il svp m'expliquer la différence entre Sleeping
, Wait
, Park
, et Monitor
thread états VisualVM.
Voici ce que j'ai trouvé:
Running
: fil est toujours en cours d'exécution. Sleeping
: le thread est en sommeil (la méthode yield () a été appelée sur l'objet thread)Wait
: thread a été bloqué par un mutex ou une barrière, et attend qu'un autre thread libère le verrouPark
: les fils garés sont suspendus jusqu'à ce qu'ils reçoivent un permis. Unparking un le thread se fait généralement en appelant la méthode unpark () sur l'objet threadMonitor
: les threads attendent à une condition de devenir true pour reprendre l'exécution
Ce que je suis incapable de comprendre, c'est le parc d'État, qu'est-ce qui suspend réellement le fil? Comment détecter dans le code ce qui a fait que le thread suspend son exécution?
Quelqu'un peut-il me guider à cet égard.
Merci.
2 answers
J'ai utilisé Google et la toute première page qui est apparue avait un très beau diagramme qui décrit à peu près tout ce que vous devez/voulez savoir. La prochaine fois, il 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'invocation de la méthode start ().
2) Exécutable
Le thread est dans un état exécutable après l'appel de la méthode start (), mais le planificateur de threads a pas sélectionné pour être le thread en cours d'exécution.
3) En cours d'exécution
Le thread est en cours d'exécution si le planificateur de threads a sélectionné.
4) Attente chronométrée
Chronométré en attente est un état de thread un thread en attente avec un temps d'attente indiqué. Un thread est dans le temps d'attente en raison d'appeler l'une des méthodes suivantes avec une attente positive temps:
- Fil.sommeil (sleeptime)
- Objet.d'attente(timeout)
- Fil.join (timeout)
- LockSupport.parkNanos(timeout)
- LockSupport.parkUntil(timeout)
5) Non exécutable (bloqué)
C'est l'état où le thread est toujours vivant, mais n'est actuellement pas éligible pour s'exécuter.
6) Terminé
Un thread est dans un état terminé ou mort lorsque sa méthode run() se termine.
J'espère que cela répond à votre question :).
Parking:
Désactive le thread actuel à des fins de planification des threads, sauf si le le permis est disponible.
Les threads sont garés ou suspendus si vous souhaitez l'appeler de cette façon car il n'a pas l'autorisation de s'exécuter. Une fois l'autorisation accordée, le thread sera unparked et exécuté.
Les permis de LockSupport sont associés aux threads (c'est-à-dire que le permis est donné à un thread particulier) et ne s'accumule pas (c'est-à-dire il peut y avoir un seul permis par thread, lorsque le thread consomme le permis, il disparaît).
VisualVM mappe l'état du thread 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 (chronométré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 sans autorité) de l'état du thread Java peut être trouvée ici.
MODIFIÉ POUR AJOUTER:
Il est également intéressant de noter que les threads bloquant dans les appels aux méthodes natives apparaissent dans la JVM en tant que RUNNABLE
, et par conséquent sont signalés par VisualVM comme Running
(et comme consommant 100% CPU).