As linhas de execução virtuais, disponibilizadas de forma geral no JDK 21, simplificam o desenvolvimento de aplicativos de alta simultaneidade. Alguns dos principais benefícios incluem:
- Maior capacidade de processamento, principalmente em aplicativos com operações de E/S de bloqueio.
- Otimização de memória devido à natureza leve.
- Modelo de simultaneidade simples em que os aplicativos podem ser representados em um estilo de linha de execução por solicitação.
Antes de aplicar threads virtuais ao seu aplicativo, consulte a JEP 444: Virtual Threads (em inglês) na documentação do Open JDK para uma descrição detalhada dos benefícios e limitações desse recurso.
Este guia mostra como configurar as bibliotecas de cliente do Cloud para Java no repositório googleapis/google-cloud-java para usar threads virtuais.
Pré-requisitos
Siga estas etapas de pré-requisito para usar threads virtuais com as bibliotecas de cliente do Cloud para Java que você quer usar no seu aplicativo.
- Se você ainda não tiver feito isso, crie um projeto do Google Cloud . Consulte Como criar e gerenciar projetos.
- Instale a Google Cloud CLI, que permite executar a amostra com as credenciais do seu projeto.
Faça login com o Application Default Credentials usando o comando a seguir. Para mais instruções, consulte Configurar as credenciais padrão do aplicativo :
gcloud auth application-default loginPara garantir que o Java Development Kit (JDK) 21 ou mais recente esteja instalado, execute o comando
java -versione verifique se a saída a seguir aparece. Para saber como instalar o JDK, consulte Como configurar um ambiente de desenvolvimento em 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)
Importar a biblioteca para o projeto
Este exemplo usa google-cloud-translate. Para saber como usar a biblioteca no Maven ou no Gradle, consulte Usar o Cloud Translation para Java.
Usar o executor de linhas de execução virtuais nas bibliotecas de cliente
Ao instanciar uma classe de biblioteca de cliente, é possível escolher a implementação de transporte dela (gRPC e REST).
Transporte REST
As bibliotecas de cliente que implementam o transporte REST usam chamadas de E/S de rede de bloqueio, que se beneficiam das melhorias de capacidade fornecidas por linhas de execução virtuais. O snippet de código a seguir demonstra como o tráfego de E/S de rede de bloqueio nas bibliotecas de cliente do Cloud para Java pode ser gerenciado por linhas de execução virtuais. Para implementar isso no seu próprio aplicativo, substitua o executor padrão por um executor de linha de execução virtual em uma instância 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
}
Transporte gRPC
Como o gRPC já usa lógica assíncrona para processar solicitações, as melhorias de capacidade das linhas de execução virtuais podem ser menos evidentes. No entanto, eles ainda podem oferecer alguns benefícios de otimização de memória devido à natureza leve. O snippet de código a seguir demonstra como as operações de transporte do gRPC podem ser gerenciadas por linhas de execução virtuais. Para implementar isso no seu próprio aplicativo, substitua o executor padrão por um executor de linhas de execução virtuais em uma instância de 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
}