English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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.
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]
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,
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: []
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.
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.
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.
Método | Descripció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 |
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.