,

De volta ao Java ☕

Escrito por

·

  1. Introdução
  2. O que muda de uma versão para outra do Java?
    1. 📌 Novos Recursos da Linguagem
    2. 📦 Novos Módulos e APIs
  3. Projeto Criado para estudo
    1. ⚙️ Async Job Runner: Java 17 vs. 21
    2. 🎯 Desafios Técnicos
    3. 🔹 Detalhes sobre o projeto desenvolvido:
  4. De volta ao básico: projeto novo
    1. Organização dos Pacotes (sugestão)
    2. Primeiro teste com cURL
    3. Algumas diferenças entre as versões
      1. Java 17
      2. Java 21
      3. O que foi modernizado no Java 21
  5. Conclusão
  6. Referências

Introdução

Bora voltar a programar em Java?! Eu estou voltando!

Para quem não sabe, minha linguagem querida de formação é Java!

Hoje, vou compartilhar uma jornada que me surgiu. Preciso começar a me atualizar na linguagem Java e para isso, decidi buscar algumas diferenças entre algumas versões.

A partir daí, escolhi fazer uma pequena prova de conceito para brincar com o código.

Minha última experiência de mercado foi com o Java 11, principalmente em migrações do Java 8 para o Java 11. Já tive algum contato com o Java 17, e sei da existência do Java 21… mas nada que seja possível medir experiência.

Então, vamos começar o básico. Ah, observação: do básico para mim.

Aqui eu estou assumindo que você já sabe o que é Java.

O que muda de uma versão para outra do Java?

As versões do Java melhoram o desempenho e a segurança. Elas trazem novos recursos e atualizações na API. Além disso, removem funcionalidades antigas. As principais mudanças nas últimas versões do Java incluem melhorias no desempenho do garbage collection. Também houve redução no consumo de memória. Além disso, há melhor suporte a containers e ambientes cloud-native. Dito isso, temos as seguintes listas:

📌 Novos Recursos da Linguagem

  • Java 8 (2014) → Introdução das Lambdas, Streams, Optional, e Interface Default Methods
  • Java 9 (2017) → Sistema de módulos (Project Jigsaw) e JShell
  • Java 10 (2018) → Inferência de tipos com var
  • Java 14 (2020) → record (classes imutáveis compactas)
  • Java 17 (2021, LTS) → Pattern Matching aprimorado e sealed classes
  • Java 21 (2023, LTS) → Virtual Threads (Project Loom) e Sequenced Collections

📦 Novos Módulos e APIs

  • HTTP Client (Java 11) → Substitui HttpURLConnection
  • Text Blocks (Java 13) → Strings multilinha mais legíveis
  • Foreign Function & Memory API (Java 21) → Facilita interação com código nativo

Um ponto importante a considerar em qualquer linguagem de programação é a frequência de atualizações e os ciclos de lançamento.

Desde o Java 9, há um ciclo de lançamento semestral. Mas apenas algumas versões são LTS (Long-Term Support), que recebem suporte por anos. São as versões LTS: Java 8, 11, 17, 21 e Não-LTS: Java 9, 10, 12-16, 18-20. Então, se por acaso você estiver planejando atualizar um sistema ou iniciar sua prova de conceito, use versões LTS. Elas serão garantia de estabilidade e suporte a longo prazo.

Projeto Criado para estudo

A ideia foi fazer uma prova de conceito (PoC) para estudar o Java 17 e 21.

Foi desenvolvido um projeto que basicamente executa tarefas assíncronas.

Ele utiliza o Virtual Threads, com o Java 21 e o Spring 3.4.3. Para o frontend, Angular 17.

⚙️ Async Job Runner: Java 17 vs. 21

O projeto simplesmente executa tarefas assíncronas.

Inicialmente, a ideia era: um agendador de tarefas assíncronas. Para que fosse possível executar jobs recorrentes, como processamento de arquivos, chamadas a APIs externas ou cálculos pesados.

Não foi possível realizar a ideia inicial – por motivos de força maior não pude atuar o quanto eu gostaria. Por isso, o projeto tem muito espaço para evolução e refatoração.

O projeto está disponível no GitHub e aberto para contribuições: https://github.com/acrispteixeira/async-scheduler-java17-21/tree/main


🎯 Desafios Técnicos

  • Comparar Virtual Threads vs. Threads tradicionais no consumo de memória e desempenho.
  • Implementar Task Execution com CompletableFuture para máxima eficiência.

🔹 Detalhes sobre o projeto desenvolvido:

  • A versão do Java 17 está numa branch separada e pode ser verificada separadamente
  • A versão do Java 21 foi a selecionada para ir para a branch principal main
  • O README está atualizado com todos os detalhes de como rodar e outros detalhes importantes – vale muito a leitura!

De volta ao básico: projeto novo

Os primeiros passos foram criar o projeto no GitHub, e clonar o projeto.

Logo em seguida, foi criado um projeto do Spring Starter. Tudo muito básico.

Organização dos Pacotes (sugestão)

src/main/java/com/seu_pacote/
├── config/ # Configurações gerais do projeto
├── scheduler/ # Lógica do Job Scheduler (opcional, pois depende se terá o scheduler)
├── metrics/ # Monitoramento (opcional no início)
├── model/ # Classes de domínio
├── service/ # Regras de negócio
└── controller/ # Endpoints REST

Primeiro teste com cURL

As primeiras implementações foram um serviço com o método de execução da tarefa.

Depois um controlador para expor a rota e chamar o serviço.

Via POST, foi possível realizar o primeiro teste.

Versão ZERO: curl -X POST http://localhost:8080/jobs/MyJob


Algumas diferenças entre as versões

Java 17

No Java 17, foi utilizado a annotation @Async do Spring juntamente com o CompletableFuture. Aqui, não temos muito segredo. O serviço retorna um CompletableFuture e a anotação vai garantir que a tarefa seja executada de forma assíncrona.

Esse é o método que foi alterado de uma versão para outra:

    // @Async serves to execute the job asynchronously using a thread pool
    @Async
    public CompletableFuture<String> executeJob(String jobName) {

        logger.info("Executando job: {}", jobName);

        try {
            Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 3000)); // Simula um tempo de execução
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        jobMetricsService.incrementJobCount();

        Job job = new Job(
                jobName,
                "Completed",
                LocalDateTime.now(),
                jobMetricsService.getJobCount(),
                LocalDateTime.now()
        );

        jobRegistry.put(jobName, job);

        return CompletableFuture.completedFuture("Job " + jobName + " finalizado!");
    }logger.info("Executando job: {}", jobName);

    try {
        Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 3000)); // Simula um tempo de execução
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }

    jobMetricsService.incrementJobCount();

    Job job = new Job(
            jobName,
            "Completed",
            LocalDateTime.now(),
            jobMetricsService.getJobCount(),
            LocalDateTime.now()
    );

    jobRegistry.put(jobName, job);

    return CompletableFuture.completedFuture("Job " + jobName + " finalizado!");
}
Java 21

Já para a versão 21, a magia está na configuração de VirtualThreads do Spring.

Que faz com que o mesmo código não tenha uma anotação e retorne simplesmente uma string.

O novo código fica muito mais simples, MAS não se pode esquecer a configuração do Virtual Threads.

Essa configuração garante que o Spring junto ao Java realize a magia de executar em threads simultâneas. Recomendo verificar as referências para viajar nesse conteúdo junto comigo.

// Usando VirtualThreads
public String executeJob(String jobName) {
logger.info("Executando job: {}", jobName);
logger.info("Thread atual: {}", Thread.currentThread());
    try {
        Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 3000)); // Simula processamento
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }

    jobMetricsService.incrementJobCount();

    Job job = new Job(
            jobName,
            "Completed",
            LocalDateTime.now(),
            jobMetricsService.getJobCount(),
            LocalDateTime.now()
    );

    synchronized (jobHistory) {
        jobHistory.addLast(job); // mantém a ordem
    }

    return "Job " + jobName + " finalizado!";
}

O que foi modernizado no Java 21
Recurso Java 21Onde está aplicado
Virtual ThreadsExecutor Executors.newVirtualThreadPerTaskExecutor()
SequencedCollectionLinkedList como SequencedCollection para jobHistory

🔥 Tecnologias e Recursos a Explorar

Aqui estão alguns itens que poderão ser evolução e maior uso dos recursos

Java 17

  • Sealed Classes → Para definir hierarquias de tarefas permitidas (e.g., OneTimeTask, RecurringTask).
  • Pattern Matching para instanceof → Para lidar com diferentes tipos de tarefas sem muitos if-else.

Java 21

  • Virtual Threads (Project Loom) → Para executar milhares de tarefas concorrentes sem criar bloqueios pesados de threads.
  • Sequenced Collections → Para gerenciar listas de tarefas em ordem previsível.
  • Foreign Function & Memory API → Se precisar de integração com código nativo.

Stack Complementar

  • Spring Boot 3 (compatível com Java 17+) para API REST.
  • PostgreSQL ou MongoDB para persistência dos jobs.
  • Quartz Scheduler ou Custom Scheduler usando Executors + Virtual Threads.

Para testar o desempenho

Independente da abordagem, você pode utilizar:

  • JMH (Java Microbenchmark Harness) → Para medir tempos de execução de trechos específicos de código.
  • Apache JMeter ou Gatling → Para testes de carga simulando múltiplos usuários.
  • Micrometer + Prometheus + Grafana → Para monitorar CPU, memória e tempo de resposta em produção.

Conclusão

Esse é o fim… do projeto e desse texto.

Com certeza, não é o fim do meu aprendizado.

Eu sei que esse post não foi detalhado tecnicamente… foi um diário de algumas horas da minha dedicação com o Java.

Pode ser um apoio para você começar!

Comente o que achou e vamos juntas!

Referências

DIO. Evolução do Java: 7.0 ao 17.0 através de exemplos. DIO, 2023. Disponível em: https://www.dio.me/articles/evolucao-do-java-70-ao-170-atraves-de-exemplos. Acesso em: 18 mar. 2025.

DIO. Diferenças entre versões do Java: uma visão geral. DIO, 2023. Disponível em: https://www.dio.me/articles/diferencas-entre-versoes-do-java-uma-visao-geral. Acesso em: 18 mar. 2025.

ALURA. Mudanças no Java desde a versão 8. Alura, 2023. Disponível em: https://www.alura.com.br/artigos/mudancas-java-versao8. Acesso em: 18 mar. 2025.

BEHLER, Marco. A guide to Java versions and features. Marco Behler Blog, 2023. Disponível em: https://www.marcobehler.com/guides/a-guide-to-java-versions-and-features. Acesso em: 18 mar. 2025.

DEVMEDIA. Entendendo e conhecendo as versões do Java. DevMedia, 2023. Disponível em: https://www.devmedia.com.br/entendendo-e-conhecendo-as-versoes-do-java/25210. Acesso em: 18 mar. 2025.

ERUDIO. Tudo o que você precisa saber sobre as versões do Java: estáveis (LTS) e de pré-lançamento. Erudio Blog, 2023. Disponível em: https://www.erudio.com.br/blog/tudo-o-que-voce-precisa-saber-sobre-as-versoes-do-java-estaveis-lts-e-de-pre-lancamento/. Acesso em: 18 mar. 2025.

GUIA DO JAVA. Java 8 ao 18: mudanças mais importantes na plataforma. Guia do Java, 2022. Disponível em: https://www.guiadojava.com.br/2022/09/java-8-ao-18-mudancas-mais-importantes.html. Acesso em: 18 mar. 2025.

NASCIMENTO, L. Java e suas evoluções. Medium, 2023. Disponível em: https://l-nascimento-scr.medium.com/java-e-suas-evolu%C3%A7%C3%B5es-3b67cdd969db. Acesso em: 18 mar. 2025.

VIKASH, D. SpringBoot @Async – the magic and the gotchas. Medium, 2023. Disponível em: https://medium.com/@dvikash1001/springboot-async-the-magic-and-the-gotchas-17f9471c6fe4. Acesso em: 6 abr. 2025.

ORACLE. Class CompletableFuture<T>. Oracle Documentation, 2023. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/CompletableFuture.html. Acesso em: 6 abr. 2025.

WIKIPEDIA. Java version history. Wikipedia: The Free Encyclopedia, 2023. Disponível em: https://en.wikipedia.org/wiki/Java_version_history. Acesso em: 18 mar. 2025.

LINKEDIN. Evolução do Java: explorando novas funcionalidades da linguagem. LinkedIn Pulse, 2023. Disponível em: https://www.linkedin.com/pulse/evolu%C3%A7%C3%A3o-do-java-explorando-novas-funcionalidades-da-linguagem-l4pvf/. Acesso em: 18 mar. 2025.

ORACLE. Java virtual threads. Java Magazine Blog, 2023. Disponível em: https://blogs.oracle.com/javamagazine/post/java-virtual-threads. Acesso em: 5 abr. 2025.


Descubra mais sobre Ana Teixeira

Assine para receber nossas notícias mais recentes por e-mail.

Deixe um comentário