Cosa sono i virtual thread
Thread leggeri in Java 21
Cosa sono i virtual thread è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Benvenuti ai thread virtuali
I thread virtuali sono diventati una funzionalità definitiva in Java 21 (JEP 444). Sono thread leggeri gestiti dalla JVM anziché dal sistema operativo.
L'obiettivo è semplice: consentire di scrivere codice lineare con un thread per richiesta, mantenendo comunque la scalabilità fino a milioni di attività simultanee.
Il problema precedente
Un tradizionale thread di piattaforma corrisponde uno a uno a un thread del sistema operativo. Ognuno consuma circa un megabyte di stack ed è costoso da creare.
Ciò significa che se ne possono eseguire solo alcune migliaia contemporaneamente. L'I/O bloccante occupa un intero thread del sistema operativo durante l'attesa.
In che modo differiscono i thread virtuali
Un thread virtuale non possiede un thread del sistema operativo. Molti thread virtuali vengono multiplexati su un piccolo pool di thread carrier di piattaforma.
- Economici da creare (migliaia al millisecondo)
- Ingombro di memoria ridotto
- Il blocco mette semplicemente in pausa il thread virtuale, liberando il thread carrier
Montaggio e smontaggio
Quando un thread virtuale è in esecuzione, viene montato su un thread carrier. Quando incontra un'operazione bloccante, viene smontato, liberando il carrier affinché possa procedere altro lavoro.
Questo meccanismo di sospensione e ripresa avviene automaticamente. Il codice si legge come normale codice bloccante.
Il primo thread virtuale
Ecco l'esempio più semplice possibile. Thread.ofVirtual().start(...) avvia un thread virtuale e join() ne attende la conclusione.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread vt = Thread.ofVirtual().start(() ->
System.out.println("Hello from a virtual thread!"));
vt.join();
System.out.println("Main is done.");
}
}Verificare che sia virtuale
Ogni Thread espone isVirtual(). Ciò consente di verificare su quale tipo di thread è in esecuzione il codice.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread vt = Thread.ofVirtual().start(() -> {
System.out.println("isVirtual: " + Thread.currentThread().isVirtual());
});
vt.join();
}
}Scalare a molte attività
Poiché i thread virtuali sono economici, avviarne decine di migliaia è del tutto normale. Qui ne avviamo 10.000.
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
public static void main(String[] args) throws InterruptedException {
AtomicInteger counter = new AtomicInteger();
Thread[] threads = new Thread[10_000];
for (int i = 0; i < threads.length; i++) {
threads[i] = Thread.ofVirtual().start(counter::incrementAndGet);
}
for (Thread t : threads) t.join();
System.out.println("Completed: " + counter.get());
}
}Assegnare un nome ai thread virtuali
È possibile assegnare un nome a un thread virtuale per semplificare il debugging, utilizzando il builder prima di avviarlo.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread vt = Thread.ofVirtual()
.name("worker-1")
.start(() ->
System.out.println("Running on: " + Thread.currentThread().getName()));
vt.join();
}
}La stessa API, un nuovo motore
I thread virtuali implementano esattamente la stessa API Thread che già conosce. Continuerà a utilizzare start, join, sleep e interrupt.
Ciò significa che le librerie esistenti basate su Thread e Runnable funzionano senza modifiche.
Quando usarli
I thread virtuali sono ideali per i carichi di lavoro I/O-bound: server web, chiamate al database e richieste ad API remote.
Non sono invece più veloci per i calcoli intensivi CPU-bound. In quel caso siete comunque limitati dal numero di core.
Non sono un pool
È importante cambiare prospettiva: i thread virtuali non vanno inseriti in un pool. Ne create uno nuovo per ogni task e lo lasciate terminare quando il task è completato.
Il pooling serve a riutilizzare risorse costose. I thread virtuali sono economici, quindi inserirli in un pool è un anti-pattern.
Verifica rapida
Verificate la vostra comprensione dei thread virtuali.
Riepilogo
Avete imparato cosa sono i thread virtuali e perché sono importanti:
- Leggeri, gestiti dalla JVM e definiti in Java 21
- Multiplexati sui thread carrier tramite mount/unmount
- Ideali per carichi di lavoro altamente concorrenti e I/O-bound
- Usano la stessa API
Thread, ma vengono creati per ogni task anziché essere inseriti in un pool
Ora imparerete i diversi modi per crearli.
Impara Java con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 104
- Lezioni
- 374
Domande Frequenti
La lezione «Cosa sono i virtual thread» è gratuita?
Sì — il testo completo di «Cosa sono i virtual thread» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Cosa sono i virtual thread»?
Thread leggeri in Java 21 Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Cosa sono i virtual thread»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Cosa sono i virtual thread
- Creare virtual thread
- Thread di piattaforma e virtual thread
- Problemi: pinning e ThreadLocal