Introdução: o que é uma fila de tarefas em Java e para que serve
Na programação, muitas vezes surge a necessidade de processar dados na ordem em que chegam. Imagine uma fila no caixa do supermercado: o primeiro a chegar é o primeiro a ser atendido. Em Java, essa lógica é implementada pela interface Queue e suas implementações. Uma fila de tarefas (Task Queue) é uma estrutura de dados que funciona pelo princípio FIFO (First In, First Out — "o primeiro a entrar é o primeiro a sair").
Para que serve isso? As filas são indispensáveis para:
- Processamento de requisições em um servidor (servidor web, API)
- Buffer de dados antes da gravação no banco de dados
- Implementação de um pool de threads (Thread Pool)
- Organização de tarefas assíncronas
Neste artigo, vamos abordar as principais interfaces e classes para trabalhar com filas em Java, escrever exemplos simples e dar dicas práticas. O material é voltado para iniciantes, então começaremos com o básico.
1. Interface Queue e seus métodos básicos
Em Java, a interface java.util.Queue define as operações principais para trabalhar com uma fila. Os principais métodos são:
add(E e)— adiciona um elemento ao final da fila. Se a fila estiver cheia, lança uma exceção.offer(E e)— adiciona um elemento. Ao contrário deadd(), retornafalseem caso de falha, em vez de uma exceção.remove()— remove e retorna o primeiro elemento. Se a fila estiver vazia, lança a exceçãoNoSuchElementException.poll()— remove e retorna o primeiro elemento, ounullse a fila estiver vazia.element()— retorna o primeiro elemento sem removê-lo. Lança exceção se a fila estiver vazia.peek()— retorna o primeiro elemento sem removê-lo, ounull.
A implementação mais popular de Queue é LinkedList. Ela é simples e adequada para a maioria das tarefas básicas.
import java.util.LinkedList;import java.util.Queue;
public class QueueExample { public static void main(String[] args) { // Criando uma fila de strings Queue<String> taskQueue = new LinkedList<>();
// Adicionando tarefas (método offer) taskQueue.offer("Tarefa 1: Processar pedido"); taskQueue.offer("Tarefa 2: Enviar email"); taskQueue.offer("Tarefa 3: Gerar relatório");
System.out.println("Fila de tarefas: " + taskQueue);
// Processando as tarefas em ordem while (!taskQueue.isEmpty()) { String task = taskQueue.poll(); // Pegando a primeira tarefa System.out.println("Executando: " + task); // Aqui você pode escrever a lógica de execução }
System.out.println("Todas as tarefas concluídas. Fila vazia: " + taskQueue.isEmpty()); }}Saída do programa:
Fila de tarefas: [Tarefa 1: Processar pedido, Tarefa 2: Enviar email, Tarefa 3: Gerar relatório]Executando: Tarefa 1: Processar pedidoExecutando: Tarefa 2: Enviar emailExecutando: Tarefa 3: Gerar relatórioTodas as tarefas concluídas. Fila vazia: true2. Deque — fila bidirecional
A interface Deque (Double Ended Queue) estende Queue e permite trabalhar com ambas as extremidades da fila. Você pode adicionar e remover elementos tanto do início quanto do final. Isso oferece mais flexibilidade.
Principais métodos adicionais:
addFirst() / offerFirst()— adicionar no início.addLast() / offerLast()— adicionar no final (análogo aoffer()).removeFirst() / pollFirst()— remover do início.removeLast() / pollLast()— remover do final.getFirst() / peekFirst()— visualizar o primeiro elemento.