Colas de tareas en Java: guía práctica con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué se necesitan colas de tareas en Java?

\n\n

En el desarrollo moderno con Java, la concurrencia no es un lujo, sino una necesidad. Las aplicaciones procesan miles de solicitudes, ejecutan tareas en segundo plano e interactúan con servicios externos. Sin una organización adecuada de las colas de tareas, el código se convierte en un caos: los hilos se bloquean entre sí, la memoria se desborda y el rendimiento cae.

\n\n

Las colas de tareas (Task Queues) son un mecanismo que permite distribuir el trabajo de manera eficiente entre los hilos. En Java, existe un potente conjunto de herramientas en el paquete java.util.concurrent. En este artículo, analizaremos cómo usar las colas de tareas en la práctica, con ejemplos de código reales.

\n\n

Aprenderá:

\n
    \n
  • Cómo funcionan BlockingQueue y sus implementaciones
  • \n
  • Cómo configurar ThreadPoolExecutor para tareas específicas
  • \n
  • Cómo evitar errores típicos al trabajar con colas
  • \n
  • Cómo probar y depurar código concurrente
  • \n
\n\n

Fundamentos de las colas de tareas: BlockingQueue

\n\n

BlockingQueue es una interfaz que subyace a la mayoría de las colas de tareas en Java. Admite operaciones de espera: si la cola está vacía, el hilo consumidor espera hasta que aparezca un elemento; si la cola está llena, el hilo productor espera hasta que se libere espacio.

\n\n

Implementaciones principales de BlockingQueue

\n\n

En Java hay varias implementaciones de BlockingQueue, cada una con sus características:

\n\n
    \n
  • ArrayBlockingQueue — tamaño fijo, basada en un array. Adecuada para escenarios con un límite conocido de tareas.
  • \n
  • LinkedBlockingQueue — opcionalmente limitada, basada en una lista enlazada. Buena para cargas dinámicas.
  • \n
  • PriorityBlockingQueue — cola ilimitada con prioridades. Se usa cuando las tareas tienen diferente importancia.
  • \n
  • SynchronousQueue — cola sin capacidad: cada insert debe esperar un remove correspondiente. Ideal para la transferencia directa de tareas.
  • \n
\n\n

Ejemplo: cola de tareas simple con ArrayBlockingQueue

\n\n

Consideremos un ejemplo básico donde un hilo genera tareas y otro las procesa:

\n\n
import java.util.concurrent.ArrayBlockingQueue;\nimport java.util.concurrent.BlockingQueue;\n\npublic class SimpleTaskQueue {\n    public static void main(String[] args) {\n        BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);\n\n        // Hilo productor\n        Thread producer = new Thread(() -> {\n            try {\n                for (int i = 1; i <= 20; i++) {\n                    String task = "Tarea nº" + i;\n                    queue.put(task); // Se bloquea si la cola está llena\n                    System.out.println("Añadida: " + task);\n                    Thread.sleep(100); // Simulación de generación\n                }\n            } catch (InterruptedException e) {\n                Thread.currentThread().interrupt();\n            }\n        });\n\n        // Hilo consumidor\n        Thread consumer = new Thread(() -> {\n            try {\n                while (true) {\n                    String task = queue.take(); // Se bloquea si la cola está vacía\n                    System.out.println("Procesada: " + task);\n                    Thread.sleep(300); // Simulación de procesamiento\n                }\n            } catch (InterruptedException e) {\n                Thread.currentThread().interrupt();\n            }\n        });\n\n        producer.start();\n        consumer.start();\n    }\n}\n
\n\n

Este código demuestra el patrón clave: el productor añade tareas mediante put(), el consumidor las toma mediante take(). Ambos métodos se bloquean cuando es necesario, lo que proporciona una sincronización natural.

\n\n

ThreadPoolExecutor: cola de tareas profesional

\n\n

En la práctica, rara vez se usa

Blogs

Book Recommendations