Padrões avançados de threading

Otimização de Código em Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Fundamentos de thread pools

Criar threads é caro!

$$

Pools de threads:

  • Reutilizam threads existentes
  • Controlam o número de threads concorrentes
  • São gerenciados pela interface ExecutorService
Otimização de Código em Java

Criando thread pools

// Pool fixo com 4 threads
ExecutorService fixedPool = Executors.newFixedThreadPool(4);


// Pool em cache que cresce conforme necessário ExecutorService cachedPool = Executors.newCachedThreadPool();
// Executor de thread única ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
Otimização de Código em Java

Enviando tarefas

ExecutorService executor = Executors.newFixedThreadPool(4);

// Enviar uma tarefa sem valor de retorno
executor.execute(() -> System.out.println("Simple task"));

// Enviar uma tarefa com valor de retorno (Callable)
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000);
    return 42;
});

// Obter o resultado do Future (bloqueia até concluir)
int result = future.get();
Otimização de Código em Java

Encerrando executors

// Sinaliza encerramento, mas mantém tarefas em execução
executor.shutdown();


// Aguardar término (com timeout) boolean terminated = executor.awaitTermination(5, TimeUnit.SECONDS);
// Forçar encerramento imediato, cancelando tarefas em execução executor.shutdownNow();
Otimização de Código em Java

O completable future

  • CompletableFuture
  • Parte da API de concorrência do Java desde o Java 8
  • Abordagem moderna para programação assíncrona
  • Pode ser concluído manualmente ou via Function
  • Permite encadear operações com callbacks
  • Funciona com ou sem pools de threads explícitos
Otimização de Código em Java

Criando completable futures

// Executar assíncrono com executor padrão
CompletableFuture<Void> runAsync = 
    CompletableFuture.runAsync(() -> performTask());

// Fornecer assíncrono com executor personalizado ExecutorService executor = Executors.newCachedThreadPool(); CompletableFuture<String> supplyAsync = CompletableFuture.supplyAsync(() -> fetchData(), executor);
Otimização de Código em Java

Encadeando operações

CompletableFuture<String> future = CompletableFuture
    .supplyAsync(() -> fetchUserData(userId))
    .thenApply(data -> extractUsername(data))
    .exceptionally(ex -> "Unknown user");

// Acessar o resultado quando pronto
future.thenAccept(result -> System.out.println(result));
Otimização de Código em Java

Vamos praticar!

Otimização de Código em Java

Preparing Video For Download...