Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

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.

Dominando Java LinkedBlockingQueue: Guía Completa y Ejemplos


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);

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

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

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

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étodoDescripció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:

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

  1. Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
  2. Comentarios en Java: Tipos, Uso y Mejores Prácticas
  3. Dominar if…else en Java: Control de Flujo Explicado
  4. Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
  5. Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
  6. Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
  7. Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
  8. Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
  9. Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
  10. Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
  11. Entendiendo Java Vector: Uso, Características y Comparación con ArrayList