Thread virtuale Java 19: dovresti usarlo?

Feb 16 2023
Questo blog è la parte 1 di una serie in 2 parti, che spiega cosa sono i thread virtuali in Java 19, come i thread virtuali possono migliorare le prestazioni dell'applicazione e infine alcuni benchmark utilizzando i thread virtuali. Cosa sono i thread virtuali : Dato che ChatGPT è il nuovo Google, chiediamogli la definizione di "Thread virtuali in Java19" (ha dato definizioni diverse e significative ogni volta, complimenti ai creatori di questa bellezza !!!) I thread virtuali sono un tipo di thread leggeri in Java 19.

Questo blog è la parte 1 di una serie in 2 parti, che spiega cosa sono i thread virtuali in Java 19 , come i thread virtuali possono migliorare le prestazioni dell'applicazione e infine alcuni benchmark utilizzando i thread virtuali.

Cosa sono i thread virtuali:

Dato che ChatGPT è il nuovo Google , chiediamogli la definizione di "Virtual Threads in Java19" (ha dato definizioni diverse e significative ogni volta, complimenti ai creatori di questa bellezza!!!)

I thread virtuali sono un tipo di thread leggeri in Java 19. I thread virtuali consentono agli utenti di creare un numero elevato di thread, senza sperimentare il sovraccarico associato ai thread tradizionali. I thread virtuali sono gestiti dalla Java Virtual Machine, quindi possono essere riutilizzati secondo necessità e consentono sostanziali miglioramenti delle prestazioni rispetto all'utilizzo dei tradizionali thread nativi.

Per gli amanti di GoLang là fuori, i thread virtuali da seguire non sono altro che "Fratello di un'altra madre"

Perché i thread virtuali sono utili

I thread virtuali Java sono diversi dai thread della piattaforma originale, nel senso che i thread virtuali sono molto più leggeri in termini di quante risorse (RAM) richiedono al sistema per essere eseguiti . Pertanto, puoi avere molti più thread virtuali in esecuzione nelle tue applicazioni rispetto ai thread della piattaforma. Nel frattempo, offrendoti tutti i vantaggi di un normale thread della piattaforma.

Utilizzo di thread virtuali

La creazione di un thread virtuale in java è simile alla creazione di un thread Runnable convenzionale. Tuttavia, utilizzeremo la classe Executors, per creare newVirtualThreadPerTaskExecutor (), che avvia un nuovo thread virtuale per ogni attività. Il numero di thread creati dall'Executor è illimitato.

Test

In questo test, chiamerò un servizio esterno (che richiede 1 millisecondo per rispondere) ed eseguirò l'operazione 1 milione di volte utilizzando sia la piattaforma convenzionale che i thread virtuali.

Obiettivo:
confrontare il tempo impiegato dai thread virtuali rispetto ai thread convenzionali per completare l'operazione 1 milione di volte.
Specifiche della macchina: 10 core, 16 GB di memoria.

Codice :

Fili convenzionali

Potevo usare solo un massimo di 1000 thread e ricevevo un errore OOM.

Fili virtuali

Risultati :

Di seguito è riportato l'utilizzo della CPU + il tempo impiegato da entrambi gli approcci per eseguire il ciclo for esterno 10 volte.

Fili convenzionali

Ingrandisci per vedere

Fili virtuali

Ingrandisci per vedere

Conclusione :

La differenza di tempo b/n con l'utilizzo di thread convenzionali rispetto a quelli virtuali ci offre un chiaro vincitore per l'utilizzo di thread virtuali nel caso in cui stiamo aspettando un servizio esterno. Se estrapoliamo questo esempio a 10 milioni o 100 milioni di chiamate, la differenza diventa significativamente maggiore e i thread virtuali emergono come quelli con le prestazioni migliori quando l'applicazione è coinvolta nell'attesa di un'applicazione esterna.

L'esempio ha simulato la chiamata di un servizio esterno utilizzando Thread.sleep(), che può essere sostituito da una chiamata effettiva a un servizio esterno. Questo è lasciato come esercizio al lettore. FALLO!!!

NOTA: è vero che per tentativi ed errori possiamo ottimizzare il numero di creazione di thread convenzionali, anche se non sarà possibile prevedere il numero perfetto di thread per ogni caso d'uso (se mantieni in modo casuale un pool con thread più alti , stai sprecando inutilmente le risorse dell'applicazione). L'utilizzo di un'allocazione dinamica dei thread (thread virtuali) ha molto più senso in un'applicazione del mondo reale.

Problemi con l'utilizzo dei thread virtuali

L'esempio sopra ti ha appena fatto capire che il thread virtuale è l'affare caldo e, per velocizzare le tue applicazioni e per un utilizzo ottimale della tua CPU, dovremmo sempre creare thread virtuali.

Se solo tutto non fosse accompagnato da un " MA ".

I thread virtuali in Java sono fantastici, ma nel caso in cui la tua applicazione non sia vincolata all'I/O, ad esempio se la CPU stessa deve eseguire un'elaborazione pesante (come l'addestramento di un modello o il conteggio fino a 100 milioni), l'utilizzo di thread virtuali non è l'ideale scelta.

I dettagli saranno forniti nella seconda parte di questo articolo. Rimani sintonizzato!!!

Pensieri finali

L'introduzione di Java 19 ai sistemi è ancora in fase di sviluppo (dal momento che il progetto Loom è solo in fase di anteprima per ora), anche se ci aspettiamo di vedere enormi miglioramenti nella gestione del server, tempi di risposta API più rapidi e problemi OOM meno frequenti.

Circa l'autore :

Yash Bansal è Associate Principal Engineer presso RedBus. Maggiori informazioni su di lui sono disponibili sul suo profilo LinkedIn .