Ciclo di vita del thread in Java

Pubblicato: 2023-01-27

Sommario

Nozioni di base sui thread Java:

Un thread in Java facilita l'esecuzione di più attività all'interno di un singolo processo. È considerato un processo leggero. Un thread può anche essere definito come una sequenza di istruzioni eseguite. Ogni thread in Java ha il proprio stack, contatore di programmi e variabili locali. I thread Java possono anche essere una serie nidificata di chiamate di metodo. La memoria, lo stato per processo e i file sono condivisi dai thread.

Usi dei thread in Java:

    • Per eseguire l'elaborazione in background o asincrona
    • Per migliorare la sensibilità delle applicazioni GUI
    • Per implementare i lati positivi dei sistemi multiprocessore
    • Per semplificare la logica di programmazione nel caso dell'esistenza di più

Esistono due percorsi di esecuzione quando viene chiamato un thread. Uno dei due percorsi viene utilizzato per l'esecuzione del thread e l'altro seguirà l'istruzione che segue l'invocazione del thread. Ogni thread in Java ha uno spazio di memoria e uno stack separati.

I fattori di rischio riscontrati durante l'utilizzo dei thread nei codici Java sono i seguenti.

  • È necessario un coordinamento adeguato tra i thread nei casi in cui i thread accedono a variabili comuni per visualizzare i dati in modo coerente.
  • Le prestazioni e la manutenzione dei thread, se abusate nei programmi, diventano difficili.

Ciclo di vita dei thread in Java:

In ogni istante dell'esecuzione del programma, i thread in Java esistono in uno qualsiasi degli stati indicati di seguito.

  1. Nuovo
  2. Bloccato
  3. Eseguibile
  4. Attesa temporizzata
  5. In attesa
  6. Terminato

Una vista dettagliata del ciclo di vita del thread in Java

Nuova discussione:

Il thread appena creato è nello stato 'Nuovo'. Non è stato eseguito in questo stato. L'esecuzione del codice di un thread nel nuovo stato deve ancora avvenire. Deve ancora funzionare.

Stato eseguibile:

I thread nello stato eseguibile sono pronti per essere eseguiti. Un thread in questo stato potrebbe essere pronto per essere eseguito in qualsiasi momento o potrebbe essere già in esecuzione. Lo scheduler del thread affina la responsabilità di allocare il tempo per l'esecuzione del thread. A ogni singolo thread viene assegnato un tempo specifico in un programma multi-thread. Ogni singolo thread viene eseguito per una breve durata e quindi incontra una pausa. La CPU viene quindi ceduta a un altro thread per consentire l'esecuzione degli altri thread. A questo punto, tutti i thread pronti per l'esecuzione in attesa della CPU ei thread in esecuzione si trovano attualmente in uno stato eseguibile.

Dai un'occhiata ai nostri corsi di tecnologia gratuiti per avere un vantaggio sulla concorrenza.

Esplora i nostri famosi corsi di ingegneria del software

Master of Science in Computer Science presso LJMU e IIITB Programma di certificazione della sicurezza informatica Caltech CTME
Bootcamp di sviluppo completo dello stack Programma PG in Blockchain
Programma Executive PG in sviluppo Full Stack
Visualizza tutti i nostri corsi di seguito
Corsi di ingegneria del software

In attesa/Stato bloccato:

Un thread si trova in uno degli stati indicati di seguito quando non è temporaneamente operativo.

  • In attesa
  • Bloccato

Un thread in attesa del completamento dell'I/O è in uno stato bloccato. La funzione del thread scheduler è quella di programmare l'esecuzione di un thread bloccato o in attesa riattivandolo. Qualsiasi thread in questo stato non è consentito per l'ulteriore continuazione dell'esecuzione finché non viene trasformato in uno stato eseguibile. I thread nello stato di blocco o di attesa non utilizzano alcun ciclo della CPU.

Un thread viene forzatamente bloccato quando tenta di accedere a una sezione protetta del codice che al momento è protetta da un altro thread. Lo scheduler trasforma uno dei thread in attesa di una sezione protetta in uno stato eseguibile quando la sezione è sbloccata per tutti i thread. D'altra parte, un thread esiste in uno stato di attesa mentre attende l'altro thread su una particolare condizione. I thread nello stato di attesa vengono inseriti in uno stato eseguibile una volta soddisfatta la condizione specificata per l'attesa. Se un thread attualmente in esecuzione viene spostato in uno stato di attesa/bloccato, lo scheduler dei thread pianifica l'esecuzione di un altro thread dalla sequenza eseguibile.

Tempo di attesa:

Quando un metodo viene richiamato con un argomento timeout, il thread esiste in uno stato di attesa temporizzato. Un thread continua a trovarsi in questo stato fino al completamento del timeout specificato o fino alla ricezione di una notifica. Ad esempio, un thread viene spostato in uno stato di attesa temporizzato se richiama l'attesa condizionale o la sospensione.

Stato terminato:

La terminazione dei thread avviene a causa di uno qualsiasi dei seguenti motivi.

  • L'uscita normale del thread al completamento dell'esecuzione dei segmenti di codice all'interno del thread.
  • Occorrenza di eventi errati rari come un'eccezione non gestita e un errore di segmentazione.

Un thread in uno stato terminato non consuma alcun ciclo della CPU.

Impara i corsi di sviluppo software online dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzata o programmi di master per accelerare la tua carriera.

Competenze di sviluppo software richieste

Corsi JavaScript Corsi Java di base Corsi di strutture dati
Corsi Node.js Corsi SQL Corsi di sviluppo full stack
Corsi NFT Corsi DevOps Corsi sui Big Data
Corsi React.js Corsi di sicurezza informatica Corsi di cloud computing
Corsi di progettazione di database Corsi Python Corsi di criptovaluta

Implementazione degli stati dei thread in Java:

Per ottenere lo stato corrente di un thread in Java, utilizziamo il metodo Thread.getState(). Java offre anche la classe java.lang.Thread.State in cui sono definite le costanti ENUM per lo stato di un thread. I dettagli sono riassunti nella tabella sottostante.

Tipo costante Dichiarazione Descrizione
Nuovo public static final Thread.State NUOVO È lo stato del thread appena creato e deve ancora iniziare la sua esecuzione.
Eseguibile pubblico statico finale Thread.State RUNNABLE Descrive lo stato di un thread che è già in esecuzione o di un thread che si trova nello stato pronto per l'esecuzione.

Lo stesso thread può trovarsi in uno stato eseguibile per la macchina virtuale Java e in uno stato di attesa per altre risorse del sistema operativo come un processore.

Bloccato public static final Thread.State BLOCCATO Descrive lo stato di un thread bloccato in attesa del blocco del monitor. Rimane nello stesso stato finché il blocco monitor non entra in un metodo/blocco sincronizzato o rientra nel metodo sincronizzato dopo aver richiamato Object.wait().
In attesa public static final Thread.State IN ATTESA Descrive lo stato di un thread in attesa a causa dell'invocazione di uno dei seguenti metodi.

  1. Object.wait senza timeout
  2. LockSupport.park
  3. Thread.join senza timeout

Lo stato di attesa può essere dovuto al completamento di una particolare attività da parte di un altro thread.

Attesa temporizzata public static final Thread.State TIMED_WAITING È uno stato del thread che attende per un tempo specificato. L'invocazione di uno dei seguenti metodi determina uno stato di attesa temporizzato di un thread con un tempo di attesa positivo assegnato.

  1. Thread.join con timeout
  2. Object.wait con timeout
  3. LockSupport.partUntil
  4. LockSupport.parkNanos
Terminato public static final Thread.State TERMINATED È lo stato di un thread che ha completato l'esecuzione delle sue istruzioni di codice costituenti.

Il thread si trova in uno stato NEW quando viene appena creato. Quando il metodo .start() viene richiamato su un thread, viene spostato in uno stato Runnable dallo scheduler del thread. Quando il metodo join() viene richiamato su un'istanza di thread, il thread che sta attualmente eseguendo l'istruzione di codice attenderà che questo thread termini. Quindi, prima della stampa dell'istruzione finale sulla console, la funzione join() viene richiamata sul thread 2 dal programma e mantiene thread1 in attesa finché thread2 non completa la sua esecuzione e passa allo stato terminato. Poiché thread1 è in attesa del completamento dell'esecuzione di thread2, viene messo nello stato WAITING.

Leggi i nostri articoli popolari relativi allo sviluppo software

Come implementare l'astrazione dei dati in Java? Cos'è la classe interna in Java? Identificatori Java: definizione, sintassi ed esempi
Comprensione dell'incapsulamento in OOPS con esempi Spiegazione degli argomenti della riga di comando in C Le 10 principali funzionalità e caratteristiche del cloud computing nel 2022
Polimorfismo in Java: concetti, tipi, caratteristiche ed esempi Pacchetti in Java e come usarli? Tutorial Git per principianti: impara Git da zero

Pregi e limiti dell'utilizzo dei thread nei programmi Java:

L'uso dei thread nei programmi Java presenta i seguenti vantaggi.

  • Riduzione dei tempi di sviluppo del codice
  • Costi di manutenzione ridotti
  • Prestazioni migliorate di applicazioni complesse
  • Aumentare la reattività delle interfacce utente
  • Parallelizzare i compiti
  • I thread vengono utilizzati nelle applicazioni server per migliorare l'elevato throughput e l'utilizzo delle risorse.
  • Se tutte le risorse di calcolo della CPU non possono essere utilizzate da un thread, l'esecuzione di un altro thread le manterrà impegnate.
  • Se lo stesso set di dati è gestito da più thread, la loro cache può essere condivisa. Ciò porta a un migliore utilizzo della cache o all'armonizzazione dei suoi valori.

Ci sono diversi svantaggi nell'usare i thread nei programmi Java. Alcuni di essi sono elencati di seguito.

  • Durante la condivisione di cache, buffer di traduzione lookaside (TLB) o qualsiasi altra risorsa hardware, più thread possono interferire tra loro.
  • Anche quando è in funzione un solo thread, il tempo di esecuzione di un thread non può essere migliorato. Tuttavia, è consentito il degrado del tempo di esecuzione. Ciò può essere dovuto agli stadi aggiuntivi della pipeline e/o alle frequenze più lente necessarie per l'adattamento dell'hardware di commutazione dei thread.
  • Sono necessarie numerose modifiche sia nei sistemi operativi che nei programmi applicativi rispetto al multiprocessing perché il supporto hardware è più esposto al software nel multithreading.

Se sei interessato a saperne di più su Java, sviluppo di software full-stack, dai un'occhiata al Programma PG esecutivo di Grad & IIIT-B in Sviluppo software - Specializzazione nello sviluppo di stack completo, progettato per professionisti che lavorano e offre oltre 500 ore di formazione rigorosa , 9+ progetti e incarichi, status di Alumni IIIT-B, pratici progetti capstone pratici e assistenza lavorativa con le migliori aziende.

Vuoi condividere questo articolo?

Preparati per una carriera del futuro

Candidati ora per i master in ingegneria del software