Dominando Java LinkedBlockingQueue: Guía Completa y Ejemplos
Java LinkedBlockingQueue
Explora la clase LinkedBlockingQueue, sus métodos principales y ejemplos reales para desbloquear colas thread-safe en Java.
La clase LinkedBlockingQueue, parte del paquete java.util.concurrent de Java, implementa una blocking queue respaldada por una lista enlazada. Cumple la interfaz BlockingQueue, proporcionando una estructura robusta, thread-safe para escenarios concurrentes productor-consumidor.

Creando un LinkedBlockingQueue
Para usar esta cola, importa java.util.concurrent.LinkedBlockingQueue:
import java.util.concurrent.LinkedBlockingQueue;
1. Sin Capacidad Inicial
LinkedBlockingQueue<Tipo> cola = new LinkedBlockingQueue<>();
La capacidad por defecto es Integer.MAX_VALUE (231–1), haciendo la cola efectivamente ilimitada.
2. Con Capacidad Especificada
LinkedBlockingQueue<Tipo> cola = new LinkedBlockingQueue<>(int capacidad);
Tipo– el tipo de elemento (ej.String,Integer)capacidad– número máximo de elementos que la cola puede contener
Ejemplo:
// Cola de cadenas con capacidad 5
LinkedBlockingQueue<String> animales = new LinkedBlockingQueue<>(5);
// Cola de enteros con capacidad 5
LinkedBlockingQueue<Integer> edades = new LinkedBlockingQueue<>(5);
Nota: La capacidad es opcional; omitirla crea una cola ilimitada.
Métodos Clave de LinkedBlockingQueue
La clase implementa todos los métodos de BlockingQueue, permitiendo inserción, recuperación y eliminación de elementos. Dos métodos—put() y take()—proporcionan comportamiento de bloqueo que distingue esta cola de las estándar.
Insertar Elementos
add(E e)– Añade un elemento, lanzando excepción si la cola está llena.offer(E e)– Añade un elemento, devolviendofalsesi la cola está llena.
Ejemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animales = new LinkedBlockingQueue<>(5);
animales.add("Perro");
animales.add("Gato");
animales.offer("Caballo");
System.out.println("LinkedBlockingQueue: " + animales);
}
}
Salida
LinkedBlockingQueue: [Perro, Gato, Caballo]
Acceder a Elementos
peek()– Recupera, pero no elimina, el elemento cabeza; devuelvenullsi está vacía.iterator()– Proporciona un iterador fail-safe sobre la cola. Importajava.util.Iteratorpara usarlo.
Ejemplo:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animales = new LinkedBlockingQueue<>(5);
animales.add("Perro");
animales.add("Gato");
animales.add("Caballo");
System.out.println("LinkedBlockingQueue: " + animales);
String cabeza = animales.peek();
System.out.println("Elemento Accedido: " + cabeza);
Iterator<String> it = animales.iterator();
System.out.print("Elementos LinkedBlockingQueue: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
Salida
LinkedBlockingQueue: [Perro, Gato, Caballo] Elemento Accedido: Perro LinkedBlockingQueue Elements: Perro, Gato, Caballo,
Eliminar Elementos
remove()– Elimina y devuelve la cabeza; lanza excepción si está vacía.poll()– Elimina y devuelve la cabeza; devuelvenullsi está vacía.clear()– Elimina todos los elementos.
Ejemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animales = new LinkedBlockingQueue<>(5);
animales.add("Perro");
animales.add("Gato");
animales.add("Caballo");
System.out.println("LinkedBlockingQueue: " + animales);
String eliminado = animales.remove();
System.out.println("Usando remove(): " + eliminado);
String sondeado = animales.poll();
System.out.println("Usando poll(): " + sondeado);
animales.clear();
System.out.println("LinkedBlockingQueue Actualizado: " + animales);
}
}
Salida
LinkedBlockingQueue: [Perro, Gato, Caballo] Usando remove(): Perro Usando poll(): Gato LinkedBlockingQueue Actualizado: []
Operaciones de Bloqueo: put() y take()
En contextos concurrentes, put() y take() bloquean el hilo llamante hasta que la operación pueda proceder, asegurando coordinación segura entre productores y consumidores.
put()
Inserta un elemento al final, esperando si la cola está llena.
Ejemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animales = new LinkedBlockingQueue<>(5);
try {
animales.put("Perro");
animales.put("Gato");
System.out.println("LinkedBlockingQueue: " + animales);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
Salida
LinkedBlockingQueue: [Perro, Gato]
take()
Recupera y elimina el elemento cabeza, bloqueando si la cola está vacía.
Ejemplo:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animales = new LinkedBlockingQueue<>(5);
try {
animales.put("Perro");
animales.put("Gato");
System.out.println("LinkedBlockingQueue: " + animales);
String eliminado = animales.take();
System.out.println("Elemento Eliminado: " + eliminado);
System.out.println("Nuevo LinkedBlockingQueue: " + animales);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
Salida
LinkedBlockingQueue: [Perro, Gato] Elemento Eliminado: Perro Nuevo LinkedBlockingQueue: [Gato]
Métodos de Utilidad Adicionales
| Método | Descripción |
|---|---|
contains(Object o) | Verifica si la cola contiene el elemento especificado. |
size() | Devuelve el número actual de elementos. |
toArray() | Convierte la cola a un array. |
toString() | Proporciona representación en cadena de la cola. |
Por Qué Elegir LinkedBlockingQueue
Porque usa una lista enlazada internamente, LinkedBlockingQueue ofrece:
- Thread-safety out of the box.
- Capacidad acotada opcional para control de back-pressure.
- Métodos de bloqueo que coordinan naturalmente productores y consumidores.
En aplicaciones multi-hilo donde un hilo puede producir más lento que otro consume, la cola suspenderá automáticamente al consumidor hasta que lleguen nuevos items, previniendo busy-waiting y reduciendo sobrecarga de CPU.
Para cargas de trabajo concurrentes de alto rendimiento, la API de concurrencia de Java recomienda LinkedBlockingQueue como estructura preferida para pipelines productor-consumidor.
---
Java
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominar if…else en Java: Control de Flujo Explicado
- Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
- Entendiendo Java Vector: Uso, Características y Comparación con ArrayList