虚拟线程在 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 开发工具包 (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 中使用该库,请参阅使用 Cloud Translation API Java 版
在客户端库中使用虚拟线程执行器
实例化客户端库类时,您可以选择其传输实现(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
}