En el artículo anterior, presenté las herramientas de programación concurrente de Java: Interfaz BlockingQueue, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue. Este artículo es el séptimo artículo de la serie.
BlockingDeque
La interfaz se define de la BlockingQueue
misma manera que la interfaz java.util.concurrent
y representa una "cola de dos extremos" segura para subprocesos, que agrega elementos a la cola u obtiene elementos de manera segura para subprocesos. Este artículo llevará a todos a aprender más BlockingDeque
.
deque
Es una abreviatura de "Double Ended Queue". Por lo tanto, el significado de "cola de dos extremos" es una cola que puede insertar y eliminar elementos de ambos extremos (la cabeza o la cola de la cola).
Si un subproceso produce y consume elementos de la misma cola, se puede usar una deque BlockingDeque
. Si el subproceso de producción debe insertarse en ambos extremos de la cola y el subproceso consumidor debe eliminarse de ambos extremos de la cola, también es posible utilizar solo la BlockingDeque
cola de dos extremos . Consulte la figura siguiente para comprender
Un hilo produce elementos y los inserta en cualquier extremo de la cola. Si la BlockingDeque
corriente está llena, inserte el hilo se bloqueará hasta que el hilo se elimine de la BlockingDeque
eliminación de un elemento. Si BlockingDeque
actualmente está vacío, el hilo de extracción se bloqueará hasta que el hilo de inserción inserte un elemento en BlockingDeque
él.
Método BlockingDeque
BlockingDeque
Hay 4 métodos diferentes para insertar, eliminar y verificar elementos en la etiqueta. Cada grupo de métodos se comporta de manera diferente cuando la operación requerida no se puede ejecutar inmediatamente. Consulte la tabla de abajo
Jefe de operaciones del equipo | Lanzar una excepción | Devuelve un valor específico | Esperando después de bloquear | Esperando tiempo de espera después del bloqueo |
---|---|---|---|---|
Insertar objeto | addFirst (o) | oferta primero (o) | poner primero (o) | offerFirst (o, tiempo de espera, unidad de tiempo) |
Quitar objeto | eliminarPrimero (o) | pollFirst () | takeFirst () | pollFirst (tiempo de espera, unidad de tiempo) |
Verificar la existencia del objeto | getFirst () | peekFirst () |
Operación de cola | Lanzar una excepción | Devuelve un valor específico | Esperando después de bloquear | Esperando tiempo de espera después del bloqueo |
---|---|---|---|---|
Insertar objeto | addLast (o) | ofertaÚltima (o) | putLast (o) | offerLast (o, tiempo de espera, unidad de tiempo) |
Quitar objeto | eliminarÚltimo (o) | pollLast () | takeLast () | pollLast (tiempo de espera, unidad de tiempo) |
Verificar la existencia del objeto | obtener ultimo() | peekLast () |
Como puede ver, estos métodos BlockingQueue
son algo similares a los métodos y , excepto que xxxFirst y xxxLast se agregan al método, por lo que puede consultar mi artículo anterior para comparar). El significado de los cuatro comportamientos del método anterior es
- Lanzar una excepción : si no se puede responder al resultado inmediatamente después de llamar al método (cola vacía o cola llena), se lanzará una excepción.
- Devolver valor específico : si no se puede responder al resultado inmediatamente después de llamar al método (cola vacía o cola llena), entonces se devuelve un valor específico (generalmente verdadero / falso), verdadero significa que el método se ejecutó correctamente, de lo contrario significa el método no se ejecuta.
- Esperando después del bloqueo : si el método no se puede responder al resultado inmediatamente después de llamar al método (cola vacía o cola llena), el método se bloqueará y se mantendrá en estado de espera.
- Esperando el tiempo de espera después del bloqueo : si el método no se puede responder al resultado inmediatamente (cola vacía o cola llena) después de llamar al método, el método se bloqueará esperando un cierto período de tiempo, es decir, bloqueado dentro del período de tiempo de espera. Cuando expira el período de tiempo de espera, el hilo del método ya no se bloqueará, sino que devolverá un valor específico (generalmente verdadero / falso), verdadero significa que el método se ejecuta correctamente, de lo contrario significa que el método no se ejecuta.
BlockingDeque 继承 BlockingQueue
La interfaz BlockingDeque hereda la interfaz BlockingQueue. Esto significa que puede usar BlockingDeque como BlockingQueue. Si hace esto, los diversos métodos de inserción agregarán el elemento al final de la deque, y el método de eliminación eliminará el elemento del encabezado de la deque. Los métodos de inserción y eliminación de la interfaz BlockingQueue hacen precisamente eso.
La siguiente es una tabla de comparación de la función del método BlockingQueue en la implementación de BlockingDeque
BlockingQueue | BlockingDeque |
---|---|
agregar() | addLast () |
oferta() | offerLast () |
poner() | putLast () |
retirar() | removeFirst () |
encuesta | pollFirst () |
llevar() | takeFirst () |
elemento() | getFirst () |
ojeada() | peekFirst () |
Clase de implementación de la interfaz BlockingDeque
BlockingDeque
Es una interfaz, por lo que cuando realmente la instanciamos, necesitamos usar su clase de implementación de interfaz. java.util.concurrent
Los LinkedBlockingDeque
métodos del paquete implementan la BlockingDeque
interfaz.
Su método de uso es BlockingQueue
similar al del mismo, por lo que aquí solo se ofrece una breve introducción.
//初始化一个LinkedBlockingDeque
BlockingDeque<String> deque = new LinkedBlockingDeque<String>();
deque.addFirst("1");//向队首添加元素
deque.addLast("2"); //向队尾添加元素
String two = deque.takeLast(); //从队尾获取元素
String one = deque.takeFirst(); //从队首获取元素
Bienvenido a seguir mi blog, hay muchas colecciones boutique.
- Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .
Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.