Virtuelle Threads, die in JDK 21 allgemein verfügbar sind, vereinfachen die Entwicklung von Anwendungen mit hoher Parallelität. Zu den wichtigsten Vorteilen gehören:
- Höherer Durchsatz, insbesondere bei Anwendungen mit blockierenden E/A-Vorgängen.
- Speicheroptimierung aufgrund ihrer geringen Größe.
- Einfaches Nebenläufigkeitsmodell, bei dem die Anwendungen als Thread pro Anfrage dargestellt werden können.
Bevor Sie virtuelle Threads in Ihrer Anwendung verwenden, lesen Sie die OpenJDK-Dokumentation zu JEP 444: Virtual Threads. Dort finden Sie eine detaillierte Beschreibung der Vorteile und Einschränkungen dieser Funktion.
In dieser Anleitung wird beschrieben, wie Sie Cloud-Clientbibliotheken für Java im googleapis/google-cloud-java-Repository für die Verwendung virtueller Threads konfigurieren.
Vorbereitung
Führen Sie diese erforderlichen Schritte aus, um virtuelle Threads mit den Cloud-Clientbibliotheken für Java zu verwenden, die Sie in Ihrer Anwendung verwenden möchten.
- Falls Sie noch kein Google Cloud -Projekt haben, erstellen Sie eines. Weitere Informationen finden Sie unter Projekte erstellen und verwalten.
- Installieren Sie die Google Cloud CLI, damit Sie das Beispiel mit den Anmeldedaten Ihres Projekts ausführen können.
Melden Sie sich mit Standardanmeldedaten für Anwendungen mit dem folgenden Befehl an. Eine Anleitung finden Sie unter Standardanmeldedaten für Anwendungen einrichten :
gcloud auth application-default loginFühren Sie den Befehl
java -versionaus, um zu prüfen, ob das Java Development Kit (JDK) 21 oder höher installiert ist. Die Ausgabe sollte so aussehen: Eine Anleitung zum Installieren des JDK finden Sie unter Java-Entwicklungsumgebung einrichten.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)
Bibliothek in Ihr Projekt importieren
In diesem Beispiel wird google-cloud-translate verwendet. Eine Anleitung zur Verwendung der Bibliothek in Maven oder Gradle finden Sie unter Cloud Translation für Java verwenden.
Virtuellen Thread-Executor in den Clientbibliotheken verwenden
Wenn Sie eine Clientbibliotheksklasse instanziieren, können Sie die Transportimplementierung (gRPC und REST) auswählen.
REST-Transport
Die Clientbibliotheken, die REST-Transport implementieren, verwenden blockierende Netzwerk-E/A-Aufrufe, die von den durch virtuelle Threads bereitgestellten Durchsatzverbesserungen profitieren. Das folgende Code-Snippet zeigt, wie blockierender Netzwerk-I/O-Traffic in den Cloud-Clientbibliotheken für Java mit virtuellen Threads verwaltet werden kann. Sie können dies in Ihrer eigenen Anwendung implementieren, indem Sie den Standard-Executor mit einem Executor für virtuelle Threads in einer TransportChannelProvider-Instanz überschreiben.
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
}
gRPC-Transport
Da gRPC bereits asynchrone Logik zur Verarbeitung von Anfragen verwendet, sind Durchsatzverbesserungen durch virtuelle Threads möglicherweise weniger ausgeprägt. Aufgrund ihrer schlanken Natur können sie jedoch trotzdem einige Vorteile bei der Speicheroptimierung bieten. Das folgende Code-Snippet zeigt, wie gRPC-Transportvorgänge von virtuellen Threads verwaltet werden können. Sie können dies in Ihrer eigenen Anwendung implementieren, indem Sie den Standard-Executor mit einem Executor für virtuelle Threads in einer TransportChannelProvider-Instanz überschreiben.
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
}