JDK 21 正式推出虛擬執行緒,可簡化高並行應用程式的開發作業。主要優點包括:
- 提高輸送量,特別是在有封鎖 I/O 作業的應用程式中。
- 由於輕巧,因此可最佳化記憶體。
- 簡單的並行模型,應用程式可以採用每個要求一個執行緒的樣式表示。
將虛擬執行緒套用至應用程式前,請參閱 Open JDK 說明文件的 JEP 444:虛擬執行緒,詳細瞭解這項功能的好處和限制。
本指南逐步說明如何在 googleapis/google-cloud-java 存放區中設定 Java 適用的 Cloud 用戶端程式庫,以使用虛擬執行緒。
必要條件
如要在應用程式中使用 Java 適用的 Cloud 用戶端程式庫搭配虛擬執行緒,請按照下列必要步驟操作。
- 請建立 Google Cloud 專案 (如果尚未建立的話)。請參閱「建立及管理專案」。
- 安裝 Google Cloud CLI,以便使用專案的憑證執行範例。
使用下列指令,透過應用程式預設憑證登入。如需進一步的操作說明,請參閱「設定應用程式預設憑證」:
gcloud auth application-default login如要確認是否已安裝 Java Development Kit (JDK) 21 以上版本,請執行
java -version指令,並確認您看到下列輸出內容。如需安裝 JDK 的步驟,請參閱「設定 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)
將程式庫匯入專案
本範例使用 google-cloud-translate。如要瞭解如何在 Maven 或 Gradle 中使用程式庫,請參閱「使用 Java 適用的 Cloud Translation」一文。
在用戶端程式庫中使用虛擬執行緒執行器
例項化用戶端程式庫類別時,您可以選擇其傳輸實作 (gRPC 和 REST)。
REST 傳輸
實作 REST 傳輸的用戶端程式庫會使用封鎖網路 I/O 呼叫,而虛擬執行緒提供的輸送量改善功能,可提升這類呼叫的效能。下列程式碼片段示範如何透過虛擬執行緒,管理 Java 適用的 Cloud 用戶端程式庫中的封鎖網路 I/O 流量。如要在自己的應用程式中實作這項功能,請在 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
}
gRPC 傳輸
由於 gRPC 已使用非同步邏輯處理要求,虛擬執行緒帶來的輸送量改善可能較不明顯。不過,由於這類函式庫較為輕巧,仍可提供一些記憶體最佳化優勢。下列程式碼片段示範如何透過虛擬執行緒管理 gRPC 傳輸作業。如要在自己的應用程式中實作這項功能,請在 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
}