VisualVM-États des Threads


Quelqu'un Peut-il svp m'expliquer la différence entre Sleeping, Wait, Park, et Monitor thread états VisualVM.

entrez la description de l'image ici

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 verrou
Park: 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 thread
Monitor: 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.

Author: Tomas Hurka, 2014-12-10

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.

entrez la description de l'image ici

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

 35
Author: Maciej Cygan, 2014-12-10 16:58:08

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

 24
Author: Jeremy, 2016-04-06 14:10:31