VisualVM - Stati thread


86

Per favore qualcuno può spiegare la differenza tra Sleeping, Wait, Park, e Monitorgli stati di thread in VisualVM.

inserisci qui la descrizione dell'immagine

Questo è quello che ho trovato:

Running: il thread è ancora in esecuzione.
Sleeping: il thread sta dormendo (il metodo yield () è stato chiamato sull'oggetto thread)
Wait: il thread è stato bloccato da un mutex o da una barriera, ed è in attesa che un altro thread rilasci il blocco
Park: i thread parcheggiati vengono sospesi fino a quando non viene loro dato un permesso. L'annullamento del parcheggio di un thread viene solitamente eseguito chiamando il metodo unpark () sull'oggetto thread
Monitor: i thread sono in attesa che una condizione diventi vera per riprendere l'esecuzione

Quello che non riesco a capire è il parco statale, cosa sospende effettivamente il filo? Come rilevo nel codice cosa ha fatto sospendere l'esecuzione al thread?

Qualcuno può guidarmi in questo senso.

Grazie.

Risposte:


53

Ho trovato un diagramma molto carino che descrive praticamente tutto ciò di cui hai bisogno / vuoi sapere.

inserisci qui la descrizione dell'immagine

  1. Nuovo

Il thread è in un nuovo stato se crei un'istanza della classe Thread ma prima dell'invocazione del metodo start ().

  1. Runnable

Il thread è in stato eseguibile dopo l'invocazione del metodo start (), ma lo scheduler del thread non lo ha selezionato come thread in esecuzione.

  1. In esecuzione

Il thread è in stato di esecuzione se è stato selezionato dallo scheduler del thread.

  1. Attesa a tempo

L'attesa a tempo è uno stato del thread per un thread in attesa con un tempo di attesa specificato. Un thread è nello stato di attesa a tempo a causa della chiamata a uno dei seguenti metodi con un tempo di attesa positivo specificato:

  • Thread.sleep (sleeptime)
  • Object.wait (timeout)
  • Thread.join (timeout)
  • LockSupport.parkNanos (timeout)
  • LockSupport.parkUntil (timeout)
  1. Non eseguibile (bloccato)

Questo è lo stato in cui il thread è ancora attivo, ma attualmente non è idoneo per l'esecuzione.

  1. Terminato

Un thread è in uno stato terminato o morto quando il suo metodo run () termina.

Spero che questo risponda alla tua domanda :).

Parcheggio:

Disabilita il thread corrente per scopi di pianificazione del thread a meno che il permesso non sia disponibile.

I thread vengono parcheggiati o sospesi se ti piace chiamarlo in questo modo perché non ha l'autorizzazione per l'esecuzione. Una volta concessa l'autorizzazione, il thread verrà sbloccato ed eseguito.

I permessi di LockSupport sono associati ai thread (cioè il permesso è dato a un particolare thread) e non si accumula (cioè può esserci un solo permesso per thread, quando il thread consuma il permesso, scompare).


Grazie per la risposta. Ho anche affrontato questo, ma in qualche modo la mia domanda è rimasta senza risposta. Potresti per favore esaminare di nuovo la mia domanda; L'ho aggiornato. Sto cercando specialmente una risposta rispetto allo stato del parco.
Ali Shah Ahmed

grazie ancora per l'aggiornamento. Quindi, nello stato del parco, il thread sta aspettando che venga programmato o è in attesa in qualche condizione?
Ali Shah Ahmed

@AliShahAhmed Thread è in attesa dell'autorizzazione (condizione) per l'esecuzione - se questa condizione non viene soddisfatta per un certo periodo di tempo viene raggiunto il timeout e il thread viene terminato - PS. Ci scusiamo per il ritardo nella risposta ahaha
Maciej Cygan

40

VisualVM mappa lo stato del thread Java (come descritto nella risposta di @ Maciej) allo stato presentato nella sua interfaccia utente come segue:

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

Sleepinge Parksono casi specifici di attesa (a tempo):

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(La mappatura viene eseguita in ThreadMXBeanDataManager.java.)

Una breve (e non autorevole) discussione sullo stato del thread Java può essere trovata qui .

MODIFICATO PER AGGIUNGERE:

Vale anche la pena notare che i thread che si bloccano nelle chiamate a metodi nativi appaiono nella JVM come RUNNABLE, e quindi sono segnalati da VisualVM come Running(e consumano il 100% della CPU).


3
Questa dovrebbe essere la risposta corretta. La domanda riguardava gli stati del thread JVisualVM non gli stati del thread JVM.
digital_infinity
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.