I thread virtuali, resi disponibili pubblicamente in JDK 21, semplificano lo sviluppo di applicazioni ad alta concorrenza. Alcuni dei principali vantaggi includono:
- Maggiore velocità effettiva, soprattutto nelle applicazioni con operazioni di I/O di blocco.
- Ottimizzazione della memoria grazie alla loro natura leggera.
- Modello di concorrenza semplice in cui le applicazioni possono essere rappresentate in uno stile thread per richiesta.
Prima di applicare i thread virtuali alla tua applicazione, consulta la JEP 444: Virtual Threads della documentazione di Open JDK per una descrizione dettagliata dei vantaggi e delle limitazioni di questa funzionalità.
Questa guida descrive come configurare le librerie client di Cloud per Java nel repository googleapis/google-cloud-java per utilizzare i thread virtuali.
Prerequisiti
Segui questi passaggi preliminari per utilizzare i thread virtuali con le librerie client di Google Cloud per Java che vuoi utilizzare nella tua applicazione.
- Se non l'hai ancora fatto, crea un Google Cloud progetto. Consulta la pagina Creazione e gestione dei progetti.
- Installa Google Cloud CLI, che ti consente di eseguire l'esempio con le credenziali del tuo progetto.
Accedi con le Credenziali predefinite dell'applicazione utilizzando il seguente comando. Per ulteriori istruzioni, consulta Configurare le credenziali predefinite dell'applicazione :
gcloud auth application-default loginPer assicurarti che Java Development Kit (JDK) 21 o versioni successive sia installato, esegui il comando
java -versione verifica di visualizzare il seguente output. Per i passaggi per installare JDK, vedi Configurazione di un ambiente di sviluppo Java.openjdk version "21.0.2" 2024-01-16 LTS OpenJDK Runtime Environment Temurin-21.0.2+13 (build 21.0.2+13-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.2+13 (build 21.0.2+13-LTS, mixed mode, sharing)
Importare la libreria nel progetto
Questo esempio utilizza google-cloud-translate. Per i passaggi per utilizzare la libreria in Maven o Gradle, consulta Utilizzare Cloud Translation per Java.
Utilizza l'executor di thread virtuali nelle librerie client
Quando crei un'istanza di una classe di libreria client, puoi scegliere la relativa implementazione del trasporto (gRPC e REST).
Trasporto REST
Le librerie client che implementano il trasporto REST utilizzano chiamate di I/O di rete bloccanti, che beneficiano dei miglioramenti del throughput forniti dai thread virtuali. Il seguente snippet di codice mostra come il blocco del traffico I/O di rete nelle librerie client Cloud per Java può essere gestito dai thread virtuali. Puoi implementare questa funzionalità nella tua applicazione sostituendo l'executor predefinito con un executor di thread virtuali in un'istanza TransportChannelProvider.
import com.google.cloud.translate.*;
import java.util.concurrent.Executors;
ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingHttpJsonChannelProvider httpJsonChannelProvider =
TranslationServiceSettings.defaultHttpJsonTransportProviderBuilder()
// Use virtual threads for network I/O calls.
.setExecutor(virtualThreadExecutor)
.build();
try (TranslationServiceClient client =
TranslationServiceClient.create(
TranslationServiceSettings.newHttpJsonBuilder()
.setTransportChannelProvider(httpJsonChannelProvider)
.build())) {
// Make translate requests
}
Trasporto gRPC
Poiché gRPC utilizza già la logica asincrona per gestire le richieste, i miglioramenti del throughput dei thread virtuali potrebbero essere meno evidenti. Tuttavia, possono comunque offrire alcuni vantaggi di ottimizzazione della memoria grazie alla loro natura leggera. Il seguente snippet di codice mostra come le operazioni di trasporto gRPC possono essere gestite dai thread virtuali. Puoi implementare questa funzionalità nella tua applicazione sostituendo l'executor predefinito con un executor di thread virtuali in un'istanza TransportChannelProvider.
import com.google.cloud.translate.*;
import java.util.concurrent.Executors;
ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingGrpcChannelProvider grpcChannelProvider =
TranslationServiceSettings.defaultGrpcTransportProviderBuilder()
// Use virtual threads for gRPC transport operations.
.setExecutor(virtualThreadExecutor)
.build();
try (TranslationServiceClient client =
TranslationServiceClient.create(
TranslationServiceSettings.newBuilder()
.setTransportChannelProvider(grpcChannelProvider)
.build())) {
// Make translate requests
}