Introducción: ¿qué es una cola de tareas en Java y para qué sirve?
En programación, a menudo surge la necesidad de procesar datos en el orden en que llegan. Imagine una cola en la caja de un supermercado: el primero que llega es el primero en ser atendido. En Java, esta lógica la implementa la interfaz Queue y sus implementaciones. Una cola de tareas (Task Queue) es una estructura de datos que funciona bajo el principio FIFO (First In, First Out — «primero en entrar, primero en salir»).
¿Para qué sirve? Las colas son indispensables para:
- Procesar solicitudes en un servidor (servidor web, API)
- Almacenar datos en búfer antes de escribirlos en la base de datos
- Implementar un grupo de hilos (Thread Pool)
- Organizar tareas asíncronas
En este artículo, analizaremos las principales interfaces y clases para trabajar con colas en Java, escribiremos ejemplos sencillos y daremos consejos prácticos. El material está pensado para principiantes, por lo que comenzaremos desde lo más básico.
1. La interfaz Queue y sus métodos básicos
En Java, la interfaz java.util.Queue define las operaciones principales para trabajar con una cola. Los métodos principales son:
add(E e)— agrega un elemento al final de la cola. Si la cola está llena, lanza una excepción.offer(E e)— agrega un elemento. A diferencia deadd(), devuelvefalseen caso de fallo, no una excepción.remove()— elimina y devuelve el primer elemento. Si la cola está vacía, lanza una excepciónNoSuchElementException.poll()— elimina y devuelve el primer elemento, onullsi la cola está vacía.element()— devuelve el primer elemento sin eliminarlo. Lanza una excepción si la cola está vacía.peek()— devuelve el primer elemento sin eliminarlo, onull.
La implementación más popular de Queue es LinkedList. Es simple y adecuada para la mayoría de las tareas básicas.
import java.util.LinkedList;import java.util.Queue;
public class QueueExample { public static void main(String[] args) { // Creamos una cola de cadenas Queue<String> taskQueue = new LinkedList<>();
// Agregamos tareas (método offer) taskQueue.offer("Tarea 1: Procesar pedido"); taskQueue.offer("Tarea 2: Enviar email"); taskQueue.offer("Tarea 3: Generar informe");
System.out.println("Cola de tareas: " + taskQueue);
// Procesamos las tareas en orden while (!taskQueue.isEmpty()) { String task = taskQueue.poll(); // Tomamos la primera tarea System.out.println("Ejecutando: " + task); // Aquí se puede escribir la lógica de ejecución }
System.out.println("Todas las tareas completadas. Cola vacía: " + taskQueue.isEmpty()); }}Salida del programa:
Cola de tareas: [Tarea 1: Procesar pedido, Tarea 2: Enviar email, Tarea 3: Generar informe]Ejecutando: Tarea 1: Procesar pedidoEjecutando: Tarea 2: Enviar emailEjecutando: Tarea 3: Generar informeTodas las tareas completadas. Cola vacía: true2. Deque — cola bidireccional
La interfaz Deque (Double Ended Queue) extiende Queue y permite trabajar con ambos extremos de la cola. Puede agregar y eliminar elementos tanto al principio como al final. Esto proporciona más flexibilidad.
Métodos adicionales principales:
addFirst() / offerFirst()— agregar al principio.addLast() / offerLast()— agregar al final (análogo aoffer()).removeFirst() / pollFirst()— eliminar del principio.removeLast() / pollLast()— eliminar del final.getFirst() / peekFirst()— ver el primer elemento.