La interfaz BlockingDeque es una parte de Java Collections Framework. Recibe su nombre porque bloquea operaciones ilegales como la inserción en una cola llena o la eliminación de una cola vacía, todas estas propiedades están integradas en la estructura de esta interfaz. Dado que es una deque (cola de dos extremos), las operaciones de inserción, eliminación y recorrido se pueden realizar desde ambos extremos. BlockingDeque es una interfaz, por lo que no podemos declarar ningún objeto con él.
Jerarquía
BlockingDeque se extiende desde la interfaz BlockingQueue, que a su vez se extiende desde la interfaz Queue y la interfaz Deque .
Nota : el marco Interfaces of the Collection puede tener clases de implementación adicionales e interfaces de extensión, pero la imagen de arriba solo muestra la jerarquía de BlockingDeque y sus clases de implementación.
Sintaxis:
public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E>
Aquí, E es el tipo de elementos en la colección.
Clases que implementan BlockingDeque
La clase de implementación de BlockingDeque es LinkedBlockingDeque . Esta clase es la implementación de BlockingDeque y la estructura de datos de lista enlazada . LinkedBlockingDeque se puede limitar opcionalmente mediante un constructor; sin embargo, si la capacidad no se especifica, es Integer.MAX_VALUE de forma predeterminada. Los Nodes se agregan dinámicamente en el momento de la inserción obedeciendo las restricciones de capacidad. Para usar BlockingDeque en su código, use esta declaración de importación.
import java.util.concurrent.BlockingDeque; (or) import java.util.concurrent.*;
La sintaxis para crear objetos:
LinkedBlockingDeque<?> objectName = new LinkedBlockingDeque<?>(); (or) BlockingDeque<?> objectName = new LinkedBlockingDeque<?>();
Ejemplo: en el código que se proporciona a continuación, realizamos algunas operaciones básicas en LinkedBlockingDeque, como crear un objeto, agregar elementos, eliminar elementos y usar un iterador para atravesar LinkedBlockingDeque.
Java
// Java Program for BlockingDeque import java.util.concurrent.*; import java.util.*; public class BlockingDequeExample { public static void main(String[] args) { // Instantiate an object using LinkedBlockingDeque named lbdq BlockingDeque<Integer> lbdq = new LinkedBlockingDeque<Integer>(); // Add elements using add() lbdq.add(134); lbdq.add(245); lbdq.add(23); lbdq.add(122); lbdq.add(90); // Create an iterator to traverse the deque Iterator<Integer> lbdqIter = lbdq.iterator(); // Print the elements of lbdq on to the console System.out.println("The LinkedBlockingDeque lbdq contains:"); for(int i = 0; i<lbdq.size(); i++) { System.out.print(lbdqIter.next() + " "); } // Remove 23 and display appropriate message if the // operation is successful if(lbdq.remove(23)) { System.out.println("\n\nThe element 23 has been removed"); } else { System.out.println("\n\nNo such element was found"); } // Print the elements of lbdq without using iterator System.out.println("\nThe LinkedBlockingDeque lbdq"+ " after remove operation contains:"); System.out.println(lbdq); } }
Producción:
The LinkedBlockingDeque lbdq contains: 134 245 23 122 90 The element 23 has been removed The LinkedBlockingDeque lbdq after remove operation contains: [134, 245, 122, 90]
Operaciones básicas
1. Agregar elementos
Los elementos se pueden agregar a un LinkedBlockedDeque de diferentes maneras según el tipo de estructura que intentemos usar. El método más común es el método add() mediante el cual podemos agregar elementos al final de la deque. También podemos usar el método addAll() (que es un método de la interfaz Collection) para agregar una colección completa a LinkedBlockingDeque. Si deseamos usar el deque como una cola, podemos usar add() y put().
Java
// Java Program for Adding elements to a LinkedBlockingDeque import java.util.concurrent.*; public class AddingElements { public static void main(String[] args) { // Instantiate a LinkedBlockingDeque named lbdq1 BlockingDeque<Integer> lbdq1 = new LinkedBlockingDeque<Integer>(); // Add elements using add() lbdq1.add(145); lbdq1.add(89); lbdq1.add(65); lbdq1.add(122); lbdq1.add(11); // Print the contents of lbdq1 on the console System.out.println("Contents of lbdq1: " + lbdq1); // Instantiate a LinkedBlockingDeque named lbdq2 LinkedBlockingDeque<Integer> lbdq2 = new LinkedBlockingDeque<Integer>(); // Add elements from lbdq1 using addAll() lbdq2.addAll(lbdq1); // Print the contents of lbdq2 on the console System.out.println("\nContents of lbdq2: " + lbdq2); } }
Contents of lbdq1: [145, 89, 65, 122, 11] Contents of lbdq2: [145, 89, 65, 122, 11]
2. Elementos de acceso
Se puede acceder a los elementos de LinkedBlockingDeque usando contains(), element(), peek(), poll(). También hay variaciones de estos métodos que se dan en la tabla anterior junto con sus descripciones.
Java
// Java Program for Accessing the elements of a LinkedBlockingDeque import java.util.concurrent.*; public class AccessingElements { public static void main(String[] args) { // Instantiate an object of LinkedBlockingDeque named lbdq BlockingDeque<Integer> lbdq = new LinkedBlockingDeque<Integer>(); // Add elements using add() lbdq.add(22); lbdq.add(125); lbdq.add(723); lbdq.add(172); lbdq.add(100); // Print the elements of lbdq on the console System.out.println("The LinkedBlockingDeque, lbdq contains:"); System.out.println(lbdq); // To check if the deque contains 22 if(lbdq.contains(22)) System.out.println("The LinkedBlockingDeque, lbdq contains 22"); else System.out.println("No such element exists"); // Using element() to retrieve the head of the deque int head = lbdq.element(); System.out.println("The head of lbdq: " + head); // Using peekLast() to retrieve the tail of the deque int tail = lbdq.peekLast(); System.out.println("The tail of lbdq: " + tail); } }
The LinkedBlockingDeque, lbdq contains: [22, 125, 723, 172, 100] The LinkedBlockingDeque, lbdq contains 22 The head of lbdq: 22 The tail of lbdq: 100
3. Eliminación de elementos
Los elementos se pueden eliminar de un LinkedBlockingDeque mediante remove(). Otros métodos como take() y poll() también se pueden usar para eliminar el primer y el último elemento.
Java
// Java Program for removing elements from a LinkedBlockingDeque import java.util.concurrent.*; public class RemovingElements { public static void main(String[] args) { // Instantiate an object of LinkedBlockingDeque named lbdq BlockingDeque<Integer> lbdq = new LinkedBlockingDeque<Integer>(); // Add elements using add() lbdq.add(75); lbdq.add(86); lbdq.add(13); lbdq.add(44); lbdq.add(10); // Print the elements of lbdq on the console System.out.println("The LinkedBlockingDeque, lbdq contains:"); System.out.println(lbdq); // Remove elements using remove(); lbdq.remove(86); lbdq.remove(44); // Trying to remove an element // that doesn't exist // in the LinkedBlockingDeque lbdq.remove(1); // Print the elements of lbdq on the console System.out.println("\nThe LinkedBlockingDeque, lbdq contains:"); System.out.println(lbdq); } }
The LinkedBlockingDeque, lbdq contains: [75, 86, 13, 44, 10] The LinkedBlockingDeque, lbdq contains: [75, 13, 10]
4. Iterando a través de los Elementos
Para iterar a través de los elementos de un LinkedBlockingDeque, podemos crear un iterador y usar los métodos de la interfaz Iterable, que es la raíz de Collection Framework de Java, para acceder a los elementos. El método next() de Iterable devuelve el elemento de cualquier colección.
Java
// Java Program to iterate through the LinkedBlockingDeque import java.util.Iterator; import java.util.concurrent.*; public class IteratingThroughElements { public static void main(String[] args) { // Instantiate an object of LinkedBlockingDeque named lbdq BlockingDeque<Integer> lbdq = new LinkedBlockingDeque<Integer>(); // Add elements using add() lbdq.add(166); lbdq.add(246); lbdq.add(66); lbdq.add(292); lbdq.add(98); // Create an iterator to traverse lbdq Iterator<Integer> lbdqIter = lbdq.iterator(); // Print the elements of lbdq on to the console System.out.println("The LinkedBlockingDeque, lbdq contains:"); for(int i = 0; i<lbdq.size(); i++) { System.out.print(lbdqIter.next() + " "); } } }
The LinkedBlockingDeque, lbdq contains: 166 246 66 292 98
Métodos de BlockingDeque
La interfaz BlockingDeque tiene varios métodos que deben ser definidos por cada clase de implementación. Un deque se puede implementar como una cola y como una pila, por lo tanto, la interfaz BlockingDeque proporciona métodos para hacer lo mismo. La siguiente tabla proporciona una lista de todos los métodos y su función.
Método |
Descripción |
---|---|
adición booleana (elemento E) | Agrega el elemento a la cola representada por este deque (es decir, en la cola) si es posible sin violar ninguna restricción de capacidad. Devuelve verdadero si la inserción es exitosa; de lo contrario, genera una excepción. |
void addFirst (elemento E) | Agrega el elemento a la cabeza del deque si es posible sin violar ninguna restricción de capacidad. Si la operación no tiene éxito, lanza una excepción. |
void addLast (elemento E) | Agrega el elemento al final del deque si es posible sin violar ninguna restricción de capacidad. Si la operación no tiene éxito, lanza una excepción. |
booleano contiene(Objeto o) | Devuelve verdadero si esta deque contiene el elemento especificado. |
elemento E() | Recupera la cabeza de la cola representada por este deque. |
Iterador<E> iterador() | Devuelve un iterador sobre los elementos de este deque en la secuencia adecuada. |
oferta booleana (elemento E) | Inserta el elemento en la cola representada por este deque (es decir, en la cola) si es posible inmediatamente sin violar ninguna restricción de capacidad. Devuelve verdadero en caso de inserción exitosa y falso en caso contrario. |
oferta booleana (elemento E, mucho tiempo, unidad TimeUnit) | Inserta el elemento en la cola representada por este deque (es decir, en la cola) inmediatamente si es posible; de lo contrario, espera el tiempo especificado para que el espacio esté disponible. |
oferta booleanaPrimero(elemento E) | Inserta el elemento en la cabecera del deque si es posible inmediatamente sin violar ninguna restricción de capacidad. Devuelve verdadero en caso de inserción exitosa y falso en caso contrario. |
oferta booleana Primero (elemento E, mucho tiempo, unidad TimeUnit) | Inserta el elemento en la cabecera del deque inmediatamente si es posible; de lo contrario, espera el tiempo especificado para que el espacio esté disponible. |
oferta booleanaLast (elemento E) | Inserta el elemento en la cola del deque si es posible inmediatamente sin violar ninguna restricción de capacidad. Devuelve verdadero en caso de inserción exitosa y falso en caso contrario. |
oferta booleana Last (elemento E, mucho tiempo, unidad TimeUnit) | Inserta el elemento en la cola del deque inmediatamente si es posible; de lo contrario, espera el tiempo especificado para que el espacio esté disponible. |
E vistazo() | Devuelve la cabeza de la cola representada por este deque si está presente; de lo contrario, devuelve nulo. |
E encuesta() | Recupera y elimina la cabeza de la cola representada por este deque si está presente; de lo contrario, devuelve nulo. |
Encuesta E (tiempo prolongado, unidad TimeUnit) | Recupera y elimina la cabeza de la cola representada por este deque. Si no hay ningún elemento presente, espera el tiempo especificado para que esté disponible. |
E pollFirst (tiempo prolongado, unidad TimeUnit) | Recupera y quita la cabeza del deque. Si no hay ningún elemento presente, espera el tiempo especificado para que esté disponible. |
E pollLast (tiempo prolongado, unidad de unidad de tiempo) | Recupera y elimina la cola del deque. Si no hay ningún elemento presente, espera el tiempo especificado para que esté disponible. |
empujón vacío(E e) | Empuja un elemento a la pila representada por este deque (en otras palabras, al principio de este deque) si es posible hacerlo inmediatamente sin violar las restricciones de capacidad, lanzando una IllegalStateException si no hay espacio disponible actualmente. |
puesta nula(E e) | Inserta el elemento especificado en la cola representada por este deque (en otras palabras, al final de este deque), esperando si es necesario que haya espacio disponible. |
void ponerPrimero(E e) | Inserta el elemento especificado al principio de este deque, esperando si es necesario que haya espacio disponible. |
void poner último(E e) | Inserta el elemento especificado al final de este deque, esperando si es necesario que haya espacio disponible. |
Eliminar() | Recupera y elimina la cabeza de la cola representada por este deque. |
eliminación booleana (Objeto obj) | Elimina la primera aparición del elemento especificado de la deque. |
booleano removeFirstOccurance(Object obj) | Elimina la primera aparición del elemento especificado de la deque. |
booleano removeLastOccurance(Object obj) | Elimina la última aparición del elemento especificado de la deque. |
tamaño int() | Devuelve el número de elementos en este deque. |
E tomar() | Recupera y elimina la cabeza de la cola representada por este deque. Si es necesario, esperar a que el elemento esté disponible. |
E tomarPrimero() | Recupera y quita la cabeza del deque. Si es necesario, esperar a que el elemento esté disponible. |
E tomar último() | Recupera y elimina la cola del deque. Si es necesario, esperar a que el elemento esté disponible. |
Aquí,
- E – El tipo de elementos de la colección.
- TimeUnit : una enumeración que representa las duraciones de tiempo.
Métodos declarados en la interfaz java.util.concurrent.BlockingQueue
MÉTODO |
DESCRIPCIÓN |
---|---|
drenajeA(Colección<? super E> c) | Elimina todos los elementos disponibles de esta cola y los agrega a la colección dada. |
drenajeA(Colección<? super E> c, int maxElements) | Elimina como máximo el número dado de elementos disponibles de esta cola y los agrega a la colección dada. |
capacidad restante() | Devuelve el número de elementos adicionales que esta cola puede aceptar idealmente (en ausencia de restricciones de memoria o recursos) sin bloqueo, o Integer.MAX_VALUE si no hay un límite intrínseco. |
Métodos declarados en la interfaz java.util.Collection
MÉTODO |
DESCRIPCIÓN |
---|---|
clear() | Elimina todos los elementos de esta colección (operación opcional). |
contieneTodo(Colección<?> c) | Devuelve verdadero si esta colección contiene todos los elementos de la colección especificada. |
es igual a(Objeto o) | Compara el objeto especificado con esta colección para la igualdad. |
código hash() | Devuelve el valor del código hash para esta colección. |
esta vacio() | Devuelve verdadero si esta colección no contiene elementos. |
flujoParalelo() | Devuelve un Stream posiblemente paralelo con esta colección como fuente. |
removeAll(Colección<?> c) | Elimina todos los elementos de esta colección que también están contenidos en la colección especificada (operación opcional). |
removeIf(predicado<? filtro super E>) | Elimina todos los elementos de esta colección que satisfacen el predicado dado. |
retenerTodo(Colección<?> c) | Retiene solo los elementos de esta colección que están contenidos en la colección especificada (operación opcional). |
divisor() | Crea un Spliterator sobre los elementos de esta colección. |
corriente() | Devuelve un Stream secuencial con esta colección como fuente. |
aArray() | Devuelve una array que contiene todos los elementos de esta colección. |
toArray(IntFunction<T[]> generador) | Devuelve una array que contiene todos los elementos de esta colección, utilizando la función de generador proporcionada para asignar la array devuelta. |
a la Array(T[] a) | Devuelve una array que contiene todos los elementos de esta colección; el tipo de tiempo de ejecución de la array devuelta es el de la array especificada. |
Métodos declarados en la interfaz java.util.Deque
MÉTODO |
DESCRIPCIÓN |
---|---|
addAll(Colección<? extiende E> c) | Agrega todos los elementos de la colección especificada al final de este deque, como si llamara a addLast(E) en cada uno, en el orden en que son devueltos por el iterador de la colección. |
iterador descendente() | Devuelve un iterador sobre los elementos de este deque en orden secuencial inverso. |
obtenerPrimero() | Recupera, pero no elimina, el primer elemento de este deque. |
obtener ultimo() | Recupera, pero no elimina, el último elemento de este deque. |
mirarPrimero() | Recupera, pero no elimina, el primer elemento de este deque, o devuelve un valor nulo si este deque está vacío. |
mirarÚltimo() | Recupera, pero no elimina, el último elemento de este deque, o devuelve un valor nulo si este deque está vacío. |
sondearprimero() | Recupera y elimina el primer elemento de este deque, o devuelve un valor nulo si este deque está vacío. |
última encuesta() | Recupera y elimina el último elemento de este deque, o devuelve un valor nulo si este deque está vacío. |
estallido() | Extrae un elemento de la pila representada por este deque. |
removeFirst() | Recupera y elimina el primer elemento de este deque. |
eliminarÚltimo() | Recupera y elimina el último elemento de este deque. |
Métodos declarados en la interfaz java.lang.Iterable
MÉTODO |
DESCRIPCIÓN |
---|---|
forEach(Consumidor<? super T> acción) | Realiza la acción dada para cada elemento del iterable hasta que se hayan procesado todos los elementos o la acción genere una excepción. |
El comportamiento de los métodos BlockingDeque
Los siguientes son los métodos proporcionados por BlockingDeque para las operaciones de inserción, eliminación y examen en el deque. Cada uno de los cuatro conjuntos de métodos se comporta de manera diferente si la operación solicitada no se cumple inmediatamente.
- Lanza una excepción: se lanzará una excepción si la operación solicitada no se cumple de inmediato.
- Valor especial: se devuelve un valor especial si la operación no se cumple inmediatamente.
- Bloqueos: la llamada al método se bloquea si la operación intentada no se satisface inmediatamente y espera hasta que se ejecuta.
- Tiempos de espera: se devuelve un valor especial que indica si la operación tuvo éxito o no. Si la operación solicitada no es posible de inmediato, la llamada al método se bloquea hasta que lo es, pero no espera más que el tiempo de espera dado.
Métodos en el Primer Elemento (Jefe de Deque) |
||||
---|---|---|---|---|
Operación | Lanza una excepción | Valor especial | bloques | Se acabó el tiempo |
Insertar | añadirprimero(e) | ofertaPrimero(e) | ponerPrimero(e) | ofertaPrimero(e, tiempo de espera, unidad de tiempo) |
Remover | removeFirst() | sondearprimero() | tomarPrimero() | pollFirst(tiempo de espera, unidad de tiempo) |
Examinar | obtenerPrimero() | mirarPrimero() | no aplica | no aplica |
Métodos en Último Elemento (Cola de Deque) |
||||
---|---|---|---|---|
Operación | Lanza una excepción | Valor especial | bloques | Se acabó el tiempo |
Insertar | agregarÚltimo(e) | ofertaÚltimo(e) | poner último (e) | ofertaÚltimo(e, tiempo de espera, unidad de tiempo) |
Remover | eliminarÚltimo() | última encuesta() | tomarÚltimo() | pollLast(tiempo de espera, unidad de tiempo) |
Examinar | obtener ultimo() | mirarÚltimo() | no aplica | no aplica |
Sabemos que podemos insertar, eliminar y examinar elementos desde ambas direcciones en BlockingDeque. Dado que BlockingDeque amplía BlockingQueue , los métodos para las operaciones de inserción, eliminación y examen que actúan en una dirección en BlockingDeque son similares a BlockingQueue. La siguiente comparación explica lo mismo.
Operación |
Método BlockingQueue |
Método BlockingDeque equivalente |
---|---|---|
Insertar | añadir (e) | agregarÚltimo(e) |
oferta | ofertaÚltimo(e) | |
poner (e) | poner último (e) | |
oferta(e, tiempo, unidad) | ofertaÚltimo(e, tiempo, unidad) | |
Remover | retirar() | removeFirst() |
encuesta() | sondearprimero() | |
tomar() | tomarPrimero() | |
encuesta (tiempo, unidad) | pollFirst(hora, unidad) | |
Examinar | elemento() | obtenerPrimero() |
ojeada() | mirarPrimero() |
Referencia: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/BlockingDeque.html
Publicación traducida automáticamente
Artículo escrito por ManasiKirloskar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA