1.ArrayBlockingQueue 介绍
Interfaz 1.1BlockingQueue
Soportes de bloqueo colas de espera: Al retirar el elemento, si la cola está vacía, espera hasta que la cola no está vacía, cuando el elemento de almacenamiento, si la cola está llena, espera hasta que la inactividad cola.
Para BlockingQueue, realizar operaciones cuando las condiciones no se cumplen, hay cuatro formas.
|
ha producido una excepción |
valor especial |
bloques |
Se acabó el tiempo |
Insertar |
(Si la cola no está llena, añadiendo, return true; Si la cola está llena, lanzar IllegalStateException) |
(Si la cola no está llena, añadiendo, return true; Si la cola está llena, return false) |
(Si la cola no está llena, añadiendo, sin valor de retorno; Si la cola está llena, espere hasta que la cola tiene inactivo) |
(Si la cola no está llena, añadiendo, return true; Si la cola está llena, espera después de un tiempo determinado o cola llena, devuelve false) |
Eliminar |
(Si la cola no está vacía, la remoción, devolución verdadera; Si la cola está vacía, devuelve falso) |
(Si la cola no está vacía, retire; Si la cola está vacía, el retorno nulo) |
(Si la cola no está vacía, retire; Si la cola está vacía, espere hasta que la cola no está vacía) |
(Si la cola no está vacía, retire; Si la cola está vacía, un tiempo especificado después de la cola de espera está vacía, el retorno nulo) |
Examinar |
no aplica |
no aplica |
Utilice la muestra - por lo general (y más), productores (multi) modelo de consumo
// hilo productor de clase Productor los implementos de la Ejecutable { Privado final BlockingQueue cola; // cola de bloqueo Productor (BlockingQueue Q) = {cola Q;} pública vacío run () { try { el tiempo ( true ) {queue.put (Produce () );} // la producción, el equipo incorpora } la captura (InterruptedException EX) {...} mango ... } productos Object () {...} } // consumidor hilo de la clase de los consumidores los implementos Ejecutable { privado Final de BlockingQueue cola; // bloqueo de cola del Consumidor (BlockingQueue Q) = {cola Q;} pública vacío run () { try { el tiempo ( true ) {Consumir (queue.take ());} // consumo quitadas } la captura (InterruptedException EX) ... mango {...} } void Consumir (objeto X) {...} } la clase de la configuración { void main () { BlockingQueue Q = nueva nueva SomeQueueImplementation (); // productores de comienzo 1 hilo, dos hilos de consumo Productor p =nuevo Productor (q); C1 Consumer = nuevo Consumidor (q); C2 Consumer = nuevo Consumidor (q); nueva rosca (P) .start (); nueva rosca (c1) .start (); nueva rosca (c2) .start (); } }
1.2ArrayBlockingQueue
segura hilo array ArrayBlockingQueue se implementa delimitada bloqueo de cola.
1. Matriz de Aplicación: array implementa utilizando una cola circular.
2. Hilo de seguridad: Utilice un ReentrantLock para garantizar la seguridad hilo.
3. delimitada: un número fijo de elementos se puede almacenar. Debido a la matriz realización interna, una vez creado, no puede cambiar la longitud de la matriz.
4. cola de bloqueo: FIFO. Cuando se toma fuera del elemento, si la cola está vacía, espera hasta que la cola no está vacía, cuando el elemento de almacenamiento, si la cola está llena, espera hasta que la cola está inactivo.
análisis de código fuente 2.ArrayBlockingQueue
2.1 Crear
público ArrayBlockingQueue con ( int Capacidad, Boolean Fair) { IF (Capacidad <= 0 ) de banda nueva nuevo una IllegalArgumentException (); The Esta .items = new new Object [Capacidad]; // array elementos de almacenamiento Lock = nuevo nuevo de ReentrantLock (Fair); // garantía de bloqueo hilo de seguridad notEmpty = lock.newCondition (); notFull = lock.newCondition (); }
2.2 Modelo Productor al Consumidor
2.2.1 productores para producir elementos --Ponga elemento de método en el equipo
método put
Cómo lograr la sincronización entre los hilos [productor] y [consumidor]
1. Si la cola está llena, el método de llamada notFull.await (), el hilo de corriente es bloqueada esperando [productor]
2. Después de que el elemento en el equipo, llamando al método notEmpty.signal (), activación bloqueado [consumidor] hilo
// inserta el elemento especificado al final de la cola // Si la cola está llena, el subproceso actual que esperar hasta que la cola está inactivo pública vacío PUT (E E) lanza InterruptedException { checkNotNull (E); final de ReentrantLock = Bloqueo de la presente .lock; // get cerradura lock.lockInterruptibly (); el try { // Si la cola está llena, el subproceso actual que esperar hasta que la cola tiene ralentí del tiempo (COUNT == items.length) notFull.await (); // cola tiene elementos de inactividad en el equipo de puesta en cola (correo ); } finally { // desbloqueo lock.unlock (); } } privada anular la enqueue (E X) { // Assert lock.getHoldCount () == 1;. // artículos Assert [putIndex] == null; // elemento en el equipo final Object [] artículos = The Esta .items; artículos [putIndex] = la X-; SI (++ putIndex == items.length) putIndex = 0 ; COUNT ++ ; // hilo de despertador bloqueado en notEmepty notEmpty.signal (); }
2.2.2 --take gasto de los consumidores elemento método de los elementos del equipo
método de toma
¿Cómo lograr [productor] y [los consumidores] sincronización de subprocesos
1. Si la cola está vacía, el método de llamada notEmpty.await (), el hilo de corriente es bloqueada esperando [consumidor]
2. Después de que el elemento en el equipo, llamando al método notFull.signal (), activación bloqueado [productor] hilo
// Devuelve la cabeza de elemento de la cola // si la cola está vacía, a la espera hasta que la cola no está vacía pública Take E () lanza InterruptedException { final de ReentrantLock = Bloqueo de la presente .lock; // obtener el bloqueo lock.lockInterruptibly (); el try { / / Si la cola está vacía, a la espera hasta que la cola no está vacía al mismo tiempo (COUNT == 0 ) notEmpty.await (); // cola no está vacía, volver los elementos de cabeza vuelven dequeue (); } la finalmente { // cierre de liberación lock.unlock (); } } privada E quitar de la cola () { //lock.getHoldCount Assert () == 1;. // Assert artículos [takeIndex] = null ;! // devolver los elementos de cabeza final Object [] artículos = The Esta .items; @SuppressWarnings ( "un sin control" ) E X = (E) [artículos]; takeIndex artículos [takeIndex] = nula ; SI (++ takeIndex == items.length) takeIndex = 0 ; COUNT - ; SI (! el RTI = nula ) itrs.elementDequeued (); // despertador bloqueado notFull roscas en notFull.signal (); retorno X; }