Feature Java: Virtual Threads

Por Gaspar Barancelli Junior em 29 de abril de 2024

As Threads Virtuais chegaram para transformar a programação concorrente na plataforma Java. Implementados pela primeira vez como um recurso de pré-visualização no JDK 19, refinada na versão 20 e libera no Java 21, esses threads prometem reduzir drasticamente o esforço necessário para escrever aplicações concorrentes que lidam com um alto volume de requisições.

O que são Threads Virtuais?

Threads Virtuais são uma implementação leve de threads na plataforma Java, concebidos para facilitar a programação de aplicações server-side que adotam o estilo de um thread por requisição. Ao contrário dos threads tradicionais, que estão vinculados a threads do sistema operacional e são limitados em número devido aos seus custos elevados, os threads virtuais podem ser criados em grande quantidade, permitindo uma utilização de hardware quase ideal.

Objetivos levados em consideração no desenvolvimento da feature

  • Permitir que aplicações que operam no modelo de uma thread por requisição sejam escaladas de maneira eficiente em termos de hardware.

  • Facilitar a transição para o uso de threads virtuais com mínimas alterações em códigos que já utilizam a API java.lang.Thread.

  • Assegurar que o gerenciamento, depuração e perfilamento de threads virtuais possam ser realizados com as ferramentas já disponíveis no JDK.

Motivação e História

Durante quase três décadas, os desenvolvedores Java têm utilizado threads como a unidade básica de concorrência para aplicações server-side. A abordagem de thread por requisição tem sido a maneira mais direta e compreensível de lidar com requisições concorrentes. No entanto, a limitação no número de threads do sistema operacional restringiu a capacidade de escala das aplicações. Com os threads virtuais, essa limitação é superada ao permitir que os threads sejam abundantes e baratos de criar.

Funcionamento das Threads Virtuais

Um thread virtual é uma instância de java.lang.Thread que não está atrelada a um thread do sistema operacional específico. Os threads virtuais são executados sobre um número reduzido de threads do sistema operacional, sendo gerenciados internamente pelo agendador de threads do JDK. Quando um thread virtual executa uma operação de I/O bloqueante, o JDK realiza uma chamada de sistema não bloqueante e suspende o thread virtual, que só é retomado quando a operação está pronta para continuar. Isso permite que os threads virtuais sejam quase infinitamente abundantes, com utilização eficiente do hardware.

Exemplos

Exemplo 1

O seguinte exemplo ilustra como criar 10.000 threads virtuais que executam uma tarefa simples concorrentemente, algo impensável com threads tradicionais devido ao alto custo e ao limite no número de threads do sistema operacional.

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        });
    });
}
Exemplo 2

Exemplo de um servidor que aceita múltiplas conexões de rede. Com threads virtuais, cada conexão pode ser tratada por um thread virtual separado, permitindo que o servidor gerencie grandes números de conexões simultâneas de maneira eficiente e com uso reduzido de recursos.

public static void main(String[] args) throws IOException {
    try (ServerSocket serverSocket = new ServerSocket(8080)) {
        while (true) {
            Socket clientSocket = serverSocket.accept();
            Thread.startVirtualThread(() -> handleRequest(clientSocket));
        }
    }
}

private static void handleRequest(Socket clientSocket) {
    // Implementação do tratamento da requisição
}

Dica: Integrando Threads Virtuais com Spring Boot 3.2

O Spring Boot 3.2 já possui suporte integrado para threads virtuais. Para utilizá-la, configure a propriedade spring.threads.virtual.enabled como true e utilize o JDK 21. Por baixo dos panos, tanto o Tomcat quanto o Jetty passarão a usar threads virtuais, o que significa que o código da aplicação que processa as requisições web agora operará sobre threads virtuais.

Conclusão

Os threads virtuais representam uma evolução significativa na forma como as aplicações Java podem escalar e lidar com a concorrência. Eles oferecem uma maneira de manter o estilo familiar de programação de um thread por requisição, enquanto proporcionam um desempenho escalável que era anteriormente inatingível com threads baseados em sistema operacional. Com a adoção crescente de threads virtuais, espera-se uma melhoria substancial no desenvolvimento e na manutenção de aplicações server-side altamente concorrentes.

// Compartilhe esse Post

💫
🔥 NOVO APP

Domine o Inglês em 30 dias!

Inteligência Artificial + Repetição Espaçada • Método cientificamente comprovado

✅ Grátis para começar 🚀 Resultados rápidos
×