Escribir en frente
Recientemente, muchos internautas han dejado un mensaje para preguntar: En la programación concurrente de Java, hay un BlockingQueue, que es una cola de bloqueo. ¿Por qué usar BlockingQueue en la programación concurrente? Bueno, hoy, hablemos de BlockingQueue temporalmente, pero hoy no es muy profundo. Analicemos esta clase desde la fuente.
Descripción general de BlockingQueue
El bloqueo de la cola es seguro para subprocesos.
La situación bloqueada es la siguiente:
(1) Cuando la cola está llena, ingrese la operación de la cola
(2) Cuando la cola está vacía, realice la operación de la cola
Los escenarios de uso son los siguientes:
Principalmente en escenarios de productores y consumidores.
Método BlockingQueue
BlockingQueue tiene 4 métodos diferentes para insertar, eliminar e inspeccionar elementos en la cola. Si la operación solicitada no se puede realizar de inmediato, cada método se comporta de manera diferente. Estos métodos son los siguientes:
Lanzar excepción | Valor especial | Bloque | Tiempo de espera | |
---|---|---|---|---|
Insertar | agregar (e) | oferta (e) | poner (e) | oferta (e, tiempo, unidad) |
Eliminar | eliminar() | encuesta() | tomar() | encuesta (tiempo, unidad) |
Cheque | elemento() | ojeada() | No disponible | No disponible |
Cuatro conjuntos diferentes de explicación comportamiento
- Lanzar excepción
Si la operación intentada no se puede realizar de inmediato, arroje una excepción.
- Valor especial
Si la operación intentada no se puede realizar de inmediato, se devuelve un valor específico (a menudo verdadero / falso).
- Bloque
Si la operación intentada no se puede ejecutar de inmediato, la llamada al método se bloqueará hasta que se pueda ejecutar.
- Tiempo de espera
Si la operación intentada no se puede ejecutar de inmediato, la llamada al método se bloqueará hasta que se pueda ejecutar, pero el tiempo de espera no excederá el valor dado. Devuelve un valor específico para saber si la operación fue exitosa (generalmente verdadero / falso).
Clase de implementación BlockingQueue
- ArrayBlockingQueue: cola de bloqueo limitada (capacidad limitada, la capacidad se debe especificar durante la inicialización y no se puede cambiar después de que se especifique la capacidad). La implementación interna es una matriz que almacena datos en modo FIFO. El último objeto insertado es la cola. El objeto eliminado más recientemente es la cabeza.
- DelayQueue: lo que está bloqueado es un elemento interno. Los elementos en DelayQueue deben implementar una interfaz retardada (existe bajo JUC). La interfaz retrasada hereda la interfaz comparable. Esto se debe a que los elementos de la interfaz retrasada deben ordenarse. En general, los elementos de la interfaz retrasada se ordenan según la prioridad del tiempo de caducidad de los elementos en la interfaz retrasada. Los escenarios de aplicación principales son: cierre regularmente la conexión, objetos de caché, procesamiento de tiempo de espera, etc. La implementación interna utiliza PriorityQueue y ReentrantLock.
- LinkedBlockingQueue: la configuración del tamaño es opcional. Si el tamaño se especifica durante la inicialización, está limitado; si el tamaño no se especifica durante la inicialización, no tiene límites (de hecho, el tamaño predeterminado es el valor máximo del tipo Entero). Cuando se implementa internamente, una lista vinculada almacena datos en forma de FIFO, el último objeto insertado es la cola y el último objeto eliminado es la cabeza.
- PriorityBlockingQueue: una cola de bloqueo con prioridad, sin límites, pero hay reglas de clasificación que permiten la inserción de objetos vacíos (es decir, nulos). Todos los objetos insertados deben implementar la interfaz Comparable, y el orden de prioridad de la cola se define de acuerdo con la implementación de la interfaz Comparable. Se puede obtener un iterador de PriorityBlockingQueue, pero este iterador no garantiza iterar en el orden de prioridad.
- SynchronousQueue: solo se permite un elemento dentro de la cola. Cuando un subproceso inserta un elemento, se bloqueará a menos que el elemento sea consumido por otro subproceso. Por lo tanto, SynchronousQueue también se llama cola de sincronización. SynchronousQueue es una cola no en caché sin límites. Hablando con precisión, no almacena elementos. Los elementos de colocación solo se pueden volver a colocar después de esperar a que se eliminen los elementos.
Escribe al final
Si el artículo le resulta útil, busque y siga la cuenta de WeChat de " Binghe Technology " en WeChat, y aprenda técnicas de programación de alta concurrencia con Binghe.
Finalmente, adjunte el mapa de conocimiento de habilidades básicas que la programación concurrente necesita dominar. Deseo que eviten desvíos cuando aprendan programación concurrente.