Java bloqueo de cola en ArrayBlockingQueue

directorio

1.ArrayBlockingQueue 介绍

Interfaz 1.1BlockingQueue

Interfaz BlockingQueue <E>

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

add(e)

(Si la cola no está llena, añadiendo, return true;

Si la cola está llena, lanzar IllegalStateException)

offer(e)

(Si la cola no está llena, añadiendo, return true;

Si la cola está llena, return false)

put(e)

(Si la cola no está llena, añadiendo, sin valor de retorno;

Si la cola está llena, espere hasta que la cola tiene inactivo)

offer(e, time, unit)

(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

remove()

(Si la cola no está vacía, la remoción, devolución verdadera;

Si la cola está vacía, devuelve falso)

poll()

(Si la cola no está vacía, retire;

Si la cola está vacía, el retorno nulo)

take()

(Si la cola no está vacía, retire;

Si la cola está vacía, espere hasta que la cola no está vacía)

poll(time, unit)

(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

element()

peek()

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; 
} 

Supongo que te gusta

Origin www.cnblogs.com/yeyang/p/12580584.html
Recomendado
Clasificación