VisualVM-Stati del thread
Qualcuno può spiegarmi la differenza tra Sleeping
, Wait
, Park
, e Monitor
stati del thread in VisualVM.
Questo è quello che ho trovato:
Running
: il thread è ancora in esecuzione. Sleeping
: thread sta dormendo (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 bloccoPark
: i fili parcheggiati sono sospesi fino a quando non viene dato un permesso. Unparking a il thread viene solitamente eseguito chiamando il metodo unpark () sull'oggetto threadMonitor
: i thread sono in attesa di una condizione per diventare veri per riprendere l'esecuzione
Quello che non riesco a capire è il Parco statale, ciò che effettivamente sospende il filo? Come rilevo nel codice cosa ha fatto sospendere il thread la sua esecuzione?
Qualcuno può per favore guidarmi in questo senso.
Grazie.
2 answers
Ho usato Google e la prima pagina che è venuta fuori aveva un diagramma molto bello che descrive praticamente tutto ciò che serve/vuole sapere. La prossima volta vale la pena provare Google per questo tipo di domande.
1) Nuovo
Il thread è nel nuovo stato se si crea un'istanza della classe Thread ma prima della chiamata del metodo start ().
2) Eseguibile
Il thread è in stato eseguibile dopo l'invocazione del metodo start (), ma lo scheduler del thread ha non selezionato per essere il thread in esecuzione.
3) In esecuzione
Il thread è in esecuzione se lo scheduler del thread lo ha selezionato.
4) Attesa temporizzata
Timed waiting è uno stato di thread per un thread in attesa con un tempo di attesa specificato. Un thread si trova nello stato di attesa temporizzata a causa della chiamata di uno dei seguenti metodi con un'attesa positiva specificata tempo:
- Discussione.sonno (sleeptime)
- Oggetto.attendere (timeout)
- Discussione.join (timeout)
- Supporto locks.parkNanos (timeout)
- Supporto locks.parkUntil (timeout)
5) Non eseguibile (bloccato)
Questo è lo stato in cui il thread è ancora attivo, ma non è attualmente idoneo per l'esecuzione.
6) Terminato
Un thread è in stato terminato o morto quando il suo metodo run() esce.
Speriamo che questo risponda alla tua domanda :).
Parcheggio:
Disabilita il thread corrente per scopi di pianificazione del thread a meno che permesso è disponibile.
I thread vengono parcheggiati o sospesi se ti piace chiamarli in questo modo perché non ha un'autorizzazione da eseguire. Una volta concessa l'autorizzazione, il thread verrà decompresso ed eseguito.
I permessi di LockSupport sono associati ai thread (cioè il permesso è dato a un particolare thread) e non si accumula (cioè ci può essere un solo permesso per thread, quando thread consuma il permesso, scompare).
VisualVM associa 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
Sleeping
e Park
sono casi specifici di attesa (temporizzata):
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 bloccano le chiamate ai metodi nativi appaiono nella JVM come RUNNABLE
e quindi sono segnalati da VisualVM come Running
(e come consumando il 100% della CPU).