English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo de Java

Java arrays

Java orientado a objetos (I)

Java orientado a objetos (II)

Java orientado a objetos (III)

Manejo de excepciones en Java

Java Lista (lista)

Java Cola (cola)

Conjuntos de Mapas de Java

Conjuntos de Java

Java entrada/salida (I/O)

Lector de Java/Writer

Temas de Java

Java LinkedBlockingQueue

En este tutorial, utilizaremos ejemplos para aprender la clase LinkedBLockingQueue y sus métodos.

La clase LinkedBlockingQueue de Java Collections framework utiliza una lista para proporcionar una implementación de cola de bloqueo.

ImplementaJava Interfaz BlockingQueue.

Crear LinkedBlockingQueue

Para crear una cola de bloqueo de lista, debemos importar el paquete java.util.concurrent.LinkedBlockingQueue.

Esta es la forma en que creamos una cola de bloqueo de lista en Java:

1.Sin capacidad inicial

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();

Aquí, la capacidad inicial por defecto es2 31 -1.

2.Con capacidad inicial

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);

Aquí,

  • Type - Tipo de cola de bloqueo de lista

  • Capacidad - Tamaño de la cola de bloqueo de lista

por ejemplo,

//Crear una cola de bloqueo de lista de tamaño5LinkedBlockingQueue de tipo cadena
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
//Crear una cola de bloqueo de lista de tamaño5LinkedBlockingQueue de tipo entero
LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>();5);

Nota:No es necesario proporcionar el tamaño de la lista.

Métodos de LinkedBlockingQueue

La clase LinkedBlockingQueue proporcionaInterfaz de BlockingQueueImplementación de todos los métodos.

Estos métodos se utilizan para insertar, acceder y eliminar elementos de la cola de bloqueo enlazada.

Además, también aprenderemos dos métodos put(), take(), que soportan operaciones de bloqueo en la cola de bloqueo de lista.

Estos métodos distinguen la cola de bloqueo de lista de otras colas típicas.

Insertar elemento

  • add() - Inserta el elemento especificado en la cola de bloqueo de lista. Si la cola está llena, lanza una excepción.

  • offer() - Inserta el elemento especificado en la cola de bloqueo de lista. Si la cola está llena, devuelve false.

por ejemplo,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
        // Usar add()
        animals.add("Dog");
        animals.add("Cat");
        // Usar offer()
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: ", + animals);
    }
}

salida de resultados

LinkedBlockingQueue: [Dog, Cat, Horse]

Acceder al elemento

  • peek() - Devuelve un elemento desde el frente de la cola de bloqueo de lista. Si la cola está vacía, devuelve null.

  • iterator() - Devuelve un objeto iterador para acceder en orden a los elementos de la cola de bloqueo de lista. Si la cola está vacía, se lanza una excepción. Debemos importar el paquete java.util.Iterator para poder usarlo.

por ejemplo,

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
        //Agregar elemento
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: ", + animals);
        // Uso de peek()
        String element = animals.peek();
        System.out.println("Acceder al elemento: ") + element);
        // Uso de iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("Elementos de LinkedBlockingQueue: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

salida de resultados

LinkedBlockingQueue: [Dog, Cat, Horse]
Acceder al elemento: Dog
Elementos de LinkedBlockingQueue: Dog, Cat, Horse,

Eliminar elemento

  • remove() - Devuelve y elimina el elemento especificado de la cola de bloqueo en la lista. Si la cola está vacía, lanza una excepción.

  • poll() - Devuelve y elimina el elemento especificado de la cola de bloqueo en la lista. Si la cola está vacía, devuelve null.

  • clear() - Eliminar todos los elementos de la cola de bloqueo en la lista.

por ejemplo,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue ") + animals);
        // Uso de remove()
        String element1 = animals.remove();
        System.out.println("Eliminar elemento:")
        System.out.println("Uso de remove(): ") + element1);
        // Uso de poll()
        String element2 = animals.poll();
        System.out.println("Uso de poll(): ") + element2);
        // Uso de clear()
        animals.clear();
        System.out.println("Actualizado LinkedBlockingQueue ") + animals);
    }
}

salida de resultados

LinkedBlockingQueue: [Dog, Cat, Horse]
Eliminar elemento:
Uso de remove(): Dog
Uso de poll(): Cat
Actualizado LinkedBlockingQueue: []

métodos put() y take()

En el proceso multihilo, podemos usar put() y take() para bloquear una operación de hilo para sincronizarla con otro hilo. Estos métodos esperarán hasta que se pueda ejecutar con éxito.

método put()

Para insertar el elemento especificado en el final de la cola de bloqueo enlazada, usamos el método put().

si la cola de bloqueo enlazada está llena, esperará hasta que haya suficiente espacio en la cola de bloqueo enlazada para insertar el elemento.

por ejemplo,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
       try {
          //agregar elementos a animals
           animals.put("Perro");
           animals.put("Gato");
           System.out.println("LinkedBlockingQueue: ", + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

salida de resultados

LinkedBlockingQueue: [Perro, Gato]

Aquí, si se interrumpe mientras espera, el método put() puede lanzar una excepción InterruptedException. Por lo tanto, debemos incluirlo enen el bloque try..catch.

método take()

Para devolver y eliminar un elemento desde el frente de la cola de bloqueo enlazada, podemos usar el método take().

si la cola de bloqueo enlazada está vacía, esperará hasta que la cola de bloqueo enlazada tenga elementos para eliminar.

por ejemplo,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
       try {
           //agregar elementos a animals
           animals.put("Perro");
           animals.put("Gato");
           System.out.println("LinkedBlockingQueue: ", + animals);
           //eliminar un elemento
           String element = animals.take();
           System.out.println("eliminar elemento: ", + element);
           System.out.println("nueva LinkedBlockingQueue: ", + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

salida de resultados

LinkedBlockingQueue: [Perro, Gato]
eliminar elemento: [Perro]
nueva LinkedBlockingQueue: [Gato]

Aquí, si se interrumpe mientras espera, el método take() lanzará una excepción InterruptedException. Por lo tanto, debemos encerrarlo en un bloque try...catch.

Otras métodos

MétodoDescripción del contenido
contains(element)Buscar el elemento especificado en la cola de bloqueo de lista. Si se encuentra el elemento, devuelve true; de lo contrario, devuelve false.
size()Devuelve la longitud de la cola de bloqueo de lista.
toArray()Convertir la cola de bloqueo de lista en un array y devolver ese array.
toString()Convertir la cola de bloqueo de lista en una cadena

¿Por qué usar LinkedBlockingQueue?

LinkedBlockingQueue utiliza una lista como su almacenamiento interno.

Se considera que线程安全Conjunto. Por lo tanto, se utiliza comúnmente en aplicaciones multihilo.

Supongamos que un hilo está insertando elementos en la cola y otro hilo está eliminando elementos de la cola.

Ahora, si el primer hilo es más lento que el segundo hilo, la cola de bloqueo de lista permite que el segundo hilo espere hasta que el primer hilo complete su operación.