Stati di un Thread in Java

Concetti Chiave
  • I thread in Java possono esistere in diversi stati:
    • NEW
    • RUNNABLE
    • BLOCKED
    • WAITING
    • TIMED_WAITING
    • TERMINATED
  • Il metodo getState() della classe Thread può essere utilizzato per ottenere lo stato corrente di un thread.
  • Lo stato di un thread può cambiare rapidamente, quindi il valore restituito da getState() potrebbe non essere aggiornato immediatamente.
  • getState() non è inteso per fornire un mezzo di sincronizzazione dei thread. È usato principalmente per il debugging o per profilare le caratteristiche run-time di un thread.

Stato di un Thread

Come menzionato nelle lezioni precedenti, un thread può esistere in un numero di stati diversi.

Per esempio, un thread può essere in esecuzione, in attesa di un lock, in attesa di un evento o terminato. Questi stati sono importanti da comprendere quando si lavora con la programmazione multithread in Java.

Possiamo ottenere lo stato corrente di un thread chiamando il metodo getState() definito da Thread. È mostrato qui:

Thread.State getState()

Restituisce un valore di tipo Thread.State che indica lo stato del thread al momento in cui la chiamata è stata effettuata. State è un'enumerazione definita da Thread.

Un'enumerazione è una lista di costanti dotate di nome. Analizzeremo le enumerazioni nelle prossime lezioni.

Ecco i valori che possono essere restituiti da getState():

Valore Stato
BLOCKED Un thread che ha sospeso l'esecuzione perché sta aspettando di acquisire un lock.
NEW Un thread che non ha iniziato l'esecuzione.
RUNNABLE Un thread che è attualmente in esecuzione oppure è pronto per andare in esecuzione non appena lo scheduler del sistema operativo gli assegna la CPU.
TERMINATED Un thread che ha terminato la propria esecuzione.
TIMED_WAITING Un thread che ha sospeso l'esecuzione per un periodo di tempo specificato, come quando si invoca sleep(). Un thread può entrare in questo stato anche quando viene invocato il metodo join() o wait() con il parametro di timeout.
WAITING Un thread che ha sospeso l'esecuzione perché sta aspettando che qualche evento si verifichi. Per esempio, sta aspettando a causa di una chiamata a una versione non-timeout di wait() o join().
Tabella 1: Stati dei Thread in Java.

La Figura che segue mostra il diagramma di come i vari stati dei thread si relazionano:

Stati di un Thread in Java
Figura 1: Stati di un Thread in Java

Data un'istanza Thread, possiamo usare getState() per ottenere lo stato di un thread. Per esempio, la seguente sequenza determina se un thread chiamato thrd è nello stato RUNNABLE al momento in cui getState() viene chiamato:

Thread thrd = ...; // un thread esistente
// ...

Thread.State ts = thrd.getState();

if(ts == Thread.State.RUNNABLE) {
    System.out.println("Il thread è in esecuzione.");
} else {
    System.out.println("Il thread non è in esecuzione.");
}

È importante capire che lo stato di un thread può cambiare dopo la chiamata a getState(). Quindi, a seconda delle circostanze, lo stato ottenuto chiamando getState() potrebbe non riflettere lo stato effettivo del thread solo un momento dopo.

Per questa (e altre) ragioni, getState() non è inteso per fornire un mezzo di sincronizzazione dei thread. È usato principalmente per il debugging o per profilare le caratteristiche run-time di un thread.