Les threads virtuels, disponibles pour tous dans JDK 21, simplifient le développement d'applications à forte concurrence. Voici quelques-uns des principaux avantages :
- Débit plus élevé, en particulier dans les applications avec des opérations d'E/S bloquantes.
- Optimisation de la mémoire grâce à leur légèreté.
- Modèle de concurrence simple dans lequel les applications peuvent être représentées dans un style de thread par requête.
Avant d'appliquer des threads virtuels à votre application, consultez la documentation OpenJDK JEP 444 : Threads virtuels pour obtenir une description détaillée des avantages et des limites de cette fonctionnalité.
Ce guide explique comment configurer les bibliothèques clientes Cloud pour Java dans le dépôt googleapis/google-cloud-java pour utiliser les threads virtuels.
Prérequis
Suivez ces étapes préalables pour utiliser des threads virtuels avec les bibliothèques clientes Cloud pour Java que vous souhaitez utiliser dans votre application.
- Si ce n'est pas déjà fait, créez un projet Google Cloud . Consultez la page Créer et gérer des projets.
- Installez Google Cloud CLI, qui vous permet d'exécuter l'exemple avec les identifiants de votre projet.
Connectez-vous avec les Identifiants par défaut de l'application à l'aide de la commande suivante. Pour obtenir d'autres instructions, consultez Configurer les identifiants par défaut de l'application :
gcloud auth application-default loginPour vous assurer que le kit de développement Java (JDK) 21 ou version ultérieure est installé, exécutez la commande
java -versionet vérifiez que la sortie suivante s'affiche. Pour savoir comment installer le JDK, consultez Configurer un environnement de développement 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)
Importer la bibliothèque dans votre projet
Cet exemple utilise google-cloud-translate. Pour savoir comment utiliser la bibliothèque dans Maven ou Gradle, consultez Utiliser Cloud Translation pour Java.
Utiliser l'exécuteur de threads virtuels dans les bibliothèques clientes
Lorsque vous instanciez une classe de bibliothèque cliente, vous pouvez choisir son implémentation de transport (gRPC et REST).
Transport REST
Les bibliothèques clientes qui implémentent le transport REST utilisent des appels d'E/S réseau bloquants, qui bénéficient des améliorations du débit fournies par les threads virtuels. L'extrait de code suivant montre comment gérer le blocage du trafic d'E/S réseau dans les bibliothèques clientes Cloud pour Java à l'aide de threads virtuels. Vous pouvez implémenter cela dans votre propre application en remplaçant l'exécuteur par défaut par un exécuteur de thread virtuel dans une instance 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
}
Transport gRPC
Étant donné que gRPC utilise déjà une logique asynchrone pour gérer les requêtes, les améliorations du débit grâce aux threads virtuels peuvent être moins prononcées. Toutefois, elles peuvent toujours offrir certains avantages en termes d'optimisation de la mémoire en raison de leur légèreté. L'extrait de code suivant montre comment les opérations de transport gRPC peuvent être gérées par des threads virtuels. Vous pouvez implémenter cela dans votre propre application en remplaçant l'exécuteur par défaut par un exécuteur de thread virtuel dans une instance 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
}