DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 80: Dê preferência aos executores, às tarefas e às streams em vez das threads

O uso de threads diretas para gerenciar tarefas assíncronas é complexo, propenso a falhas e não recomendado no desenvolvimento moderno em Java. A introdução do Executor Framework no pacote java.util.concurrent simplifica e melhora a execução de tarefas ao desacoplar a unidade de trabalho (tarefas) do mecanismo de execução.

Vantagens do Executor Framework

  • Simplicidade: Criar uma fila de trabalho ou pool de threads agora requer apenas uma linha de código usando as fábricas estáticas da classe Executors.
  • Flexibilidade: Suporte a tarefas com retorno de resultados (Callable), agendamento de tarefas (ScheduledThreadPoolExecutor), e finalização graciosa de tarefas (shutdown e awaitTermination).
  • Escalabilidade: Possibilidade de configurar pools de threads fixos ou variáveis para gerenciar carga com eficiência.
  • Evita Sobrecarga: Para servidores pesados, é recomendado o uso de pools fixos (newFixedThreadPool) em vez de pools dinâmicos (newCachedThreadPool), evitando a criação excessiva de threads que pode degradar o desempenho.

Tarefas vs Threads

  • Tarefas: Representadas por Runnable ou Callable, são unidades de trabalho independentes.
  • Executores: Os serviços executores gerenciam a execução das tarefas, permitindo flexibilidade na seleção e alteração de políticas de execução.

Extensões do Executor Framework

  • Tarefas Fork-Join: Introduzidas no Java 7, permitem dividir tarefas em subtarefas menores, processadas em paralelo por um ForkJoinPool. As threads nesse pool realizam “roubo de tarefas” para maximizar a utilização da CPU e o desempenho.
  • Streams Paralelas: Construídas sobre pools fork-join, oferecem um meio fácil de aproveitar o paralelismo sem precisar lidar diretamente com a complexidade do fork-join.

Recomendações Gerais

  • Evite gerenciar diretamente threads ou implementar suas próprias filas de trabalho.
  • Use o Executor Framework para aproveitar suas abstrações e benefícios.
  • Para uma compreensão mais profunda, consulte "Java Concurrency in Practice".
  • A adoção do Executor Framework é para a execução de tarefas o que o Collections Framework foi para a manipulação de coleções, trazendo padrões consistentes, reutilizáveis e eficientes ao desenvolvimento Java.

Top comments (0)