Java ArrayBlockingQueue: Guía Avanzada de Colas de Bloqueo y Operaciones Thread-Safe
Java ArrayBlockingQueue
Explora ArrayBlockingQueue de Java – aprende a crear, manipular y usar thread-safely esta cola de bloqueo de tamaño fijo con ejemplos claros.
La clase ArrayBlockingQueue en el Framework de Colecciones de Java proporciona una cola acotada, thread-safe respaldada por un array. Implementa la interfaz BlockingQueue, permitiendo a productores y consumidores coordinarse vía operaciones de bloqueo.

Creando un ArrayBlockingQueue
Importa java.util.concurrent.ArrayBlockingQueue e instancia con una capacidad fija:
ArrayBlockingQueue<Tipo> cola = new ArrayBlockingQueue<>(capacidad);
Donde Tipo es el tipo de elemento y capacidad es el tamaño máximo.
- Ejemplo – Cola de cadenas de tamaño 5:
ArrayBlockingQueue<String> animales = new ArrayBlockingQueue<>(5); - Ejemplo – Cola de enteros de tamaño 5:
ArrayBlockingQueue<Integer> edades = new ArrayBlockingQueue<>(5);
Nota: La capacidad es obligatoria; determina el tamaño acotado de la cola.
Métodos Principales de ArrayBlockingQueue
La clase implementa todos los métodos de BlockingQueue para insertar, acceder y eliminar elementos. A continuación, las operaciones más usadas.
Insertar Elementos
add(E e)– Añade el elemento; lanzaIllegalStateExceptionsi está llena.offer(E e)– Añade el elemento; devuelvefalsesi está llena.
ArrayBlockingQueue<String> animales = new ArrayBlockingQueue<>(5);
animales.add("Perro");
animales.offer("Gato");
animales.offer("Caballo");
System.out.println("ArrayBlockingQueue: " + animales);
Salida: ArrayBlockingQueue: [Perro, Gato, Caballo]
Acceder a Elementos
peek()– Recupera la cabeza sin eliminarla; devuelvenullsi está vacía.iterator()– Proporciona un iterador fail-fast sobre la cola.
String cabeza = animales.peek();
System.out.println("Elemento cabeza: " + cabeza);
Iterator<String> it = animales.iterator();
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
Salida: Elemento cabeza: Perro seguido de la lista de elementos.
Eliminar Elementos
remove()– Elimina y devuelve la cabeza; lanzaNoSuchElementExceptionsi está vacía.poll()– Elimina y devuelve la cabeza; devuelvenullsi está vacía.clear()– Vacía la cola.
String eliminado1 = animales.remove();
String eliminado2 = animales.poll();
animales.clear();
System.out.println("Cola actualizada: " + animales);
Salida: Cola actualizada: []
Operaciones de Bloqueo: put() y take()
Estos métodos son esenciales para patrones productor-consumidor. Bloquean hasta que la operación pueda realizarse, asegurando coordinación de hilos.
put()
Inserta un elemento, esperando si la cola está llena. Puede lanzar InterruptedException.
try {
animales.put("Perro");
animales.put("Gato");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
take()
Elimina y devuelve la cabeza, esperando si la cola está vacía. Puede lanzar InterruptedException.
try {
String elemento = animales.take();
System.out.println("Eliminado: " + elemento);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
Métodos de Conveniencia Adicionales
| Método | Descripción |
|---|---|
contains(Object o) | Devuelve true si la cola contiene el elemento especificado. |
size() | Devuelve el número actual de elementos. |
toArray() | Convierte la cola a un array. |
toString() | Representación en cadena de la cola. |
Por Qué Usar ArrayBlockingQueue
Porque ofrece:
- Seguridad en hilos: Sincronización integrada para acceso concurrente.
- Tamaño fijo: Previene crecimiento de memoria descontrolado.
- Semántica de bloqueo: Simplifica coordinación productor-consumidor.
Cuando un hilo produce más lento que el consumidor, el consumidor se bloquea automáticamente, evitando espera activa y asegurando uso eficiente de CPU.
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