Filas de tarefas 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

Filas de Tarefas em Java: do Básico às Soluções Multithread



Fila de Tarefas (Task Queue) é um dos padrões fundamentais no desenvolvimento de software. Em Java, esse mecanismo é implementado através da interface Queue e suas inúmeras implementações. A fila permite organizar o processamento de tarefas na ordem em que chegam (FIFO — First In, First Out), o que é especialmente importante ao trabalhar com pools de threads, operações assíncronas e sistemas distribuídos.



Neste artigo, vamos detalhar como trabalhar com filas de tarefas em Java: desde a interface básica até implementações multithread avançadas. Você aprenderá quais classes usar em diferentes cenários e como evitar erros típicos.



1. Interface Queue e Operações Básicas



A interface Queue faz parte do Java Collections Framework. Ela define os métodos principais para trabalhar com filas:



  • add(E e) — adiciona um elemento, lança exceção em caso de estouro;
  • offer(E e) — adiciona um elemento, retorna false em caso de falha;
  • remove() — remove e retorna o elemento da cabeça, lança exceção se a fila estiver vazia;
  • poll() — remove e retorna o elemento da cabeça, retorna null se a fila estiver vazia;
  • element() — retorna o elemento da cabeça sem removê-lo, exceção se a fila estiver vazia;
  • peek() — retorna o elemento da cabeça sem removê-lo, null se a fila estiver vazia.


Exemplo básico de trabalho com fila:



import java.util.LinkedList;import java.util.Queue;

public class SimpleQueueExample { public static void main(String[] args) { Queue<String> taskQueue = new LinkedList<>();

// Adicionando tarefas taskQueue.offer("Tarefa 1: Processar pedido"); taskQueue.offer("Tarefa 2: Enviar email"); taskQueue.offer("Tarefa 3: Gerar relatório");

System.out.println("Tarefa atual: " + taskQueue.peek()); System.out.println("Tamanho da fila: " + taskQueue.size());

// Processando todas as tarefas while (!taskQueue.isEmpty()) { String task = taskQueue.poll(); System.out.println("Executando: " + task); } }}


Resultado da execução:

Tarefa atual: Tarefa 1: Processar pedidoTamanho da fila: 3Executando: Tarefa 1: Processar pedidoExecutando: Tarefa 2: Enviar emailExecutando: Tarefa 3: Gerar relatório


2. Principais Implementações de Filas



O Java oferece várias implementações da interface Queue, cada uma adequada para cenários específicos.



2.1. LinkedList como Fila

LinkedList é uma das implementações mais simples e versáteis. Ela funciona como uma lista duplamente encadeada, permitindo adicionar e remover elementos rapidamente de ambas as extremidades. No entanto, para grandes volumes de dados, o desempenho pode diminuir devido à sobrecarga de armazenamento de referências.



Queue<Integer> linkedQueue = new LinkedList<>();linkedQueue.add(10);linkedQueue.add(20);linkedQueue.add(30);System.out.println(linkedQueue.poll()); // 10


2.2. PriorityQueue — Fila com Prioridades

PriorityQueue não segue a ordem estrita FIFO. Os elementos são removidos na ordem de sua prioridade, que é definida pela ordem natural (Comparable) ou por um comparador. Esta é a escolha ideal para sistemas onde algumas tarefas são mais importantes que outras.



import java.util.PriorityQueue;import java.util.Queue;

public class PriorityQueueExample { public static void main(String[] args) { Queue<Task> priorityQueue = new PriorityQueue<>( (t1, t2) -> Integer.compare(t1.priority, t2.priority) );

Blogs

Book Recommendations