Programação Assíncrona em Java: Guia Completo com Exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução à Programação Assíncrona em Java



Programação assíncrona é um paradigma de desenvolvimento onde a execução de operações longas (como requisições de rede, leitura de arquivos ou cálculos) não bloqueia a thread principal da aplicação. Em Java, esse conceito passou por uma longa evolução: desde threads básicas (Thread) até abstrações poderosas como CompletableFuture e fluxos reativos.



No desenvolvimento moderno, a assincronia é criticamente importante para criar servidores web responsivos, microsserviços de alta carga e processadores de dados eficientes. Este guia ajudará você a dominar todos os aspectos-chave da programação assíncrona em Java, desde o básico até técnicas avançadas.



Fundamentos: threads e ExecutorService



O problema das operações bloqueantes



O código síncrono tradicional bloqueia a thread até a conclusão da operação. Por exemplo, ao executar uma requisição HTTP:



public String fetchData() throws InterruptedException {    Thread.sleep(2000); // Simulação de requisição longa    return "Dados recebidos";}


Enquanto o método fetchData() é executado, a thread não pode processar outras requisições. Em aplicações multithread, isso leva ao uso ineficiente de recursos.



ExecutorService — gerenciamento de pool de threads



O Java fornece ExecutorService para gerenciar um pool de threads. Em vez de criar novas threads manualmente, você usa um pool pronto:



import java.util.concurrent.*;

public class ExecutorExample { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(4); Future<String> future = executor.submit(() -> { Thread.sleep(2000); return "Resultado do cálculo"; }); System.out.println("Aguardando resultado..."); String result = future.get(); // Bloqueia a thread até obter o resultado System.out.println("Recebido: " + result); executor.shutdown(); }}


Importante: Future.get() é uma operação bloqueante. Para assincronia real, são necessárias ferramentas mais avançadas.



CompletableFuture: assincronia poderosa



A partir do Java 8, CompletableFuture tornou-se a principal ferramenta para programação assíncrona. Ele permite criar cadeias de operações assíncronas sem bloquear threads.



Criação e operações básicas



import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;

public class CompletableFutureExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // Execução assíncrona CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Resultado assíncrono"; }); // Processamento não bloqueante do resultado future.thenAccept(result -> System.out.println("Processado: " + result)); System.out.println("Thread principal continua trabalhando..."); // Bloqueio para finalizar o programa future.get(); }}


Cadeias e combinações



Uma das principais vantagens do CompletableFuture é a capacidade de construir cadeias complexas de operações assíncronas:



public class AsyncChainExample {    public static void main(String[] args) throws ExecutionException, InterruptedException {        CompletableFuture.supplyAsync(() -> {            System.out.println("Passo 1: Obtendo dados");            return "user_123";        })        .thenApp                

Blogs

Book Recommendations