Herramientas simultáneas CountDownLatch, CyclicBarrier (barrera de sincronización), semáforo (control del número de hilos concurrentes), intercambiador (datos de intercambio de hilos)

CountDownLatch

Principio de introducción

  CountDownLatch es implementado por el sincronizador de colas.

  Al construir un nuevo objeto CountDownLatch, debe pasar un parámetro int entero mayor que 0. Este parámetro se usa como el estado de sincronización de estado del sincronizador de cola.

    public CountDownLatch ( int count) {
         if (count < 0 ) throw  new IllegalArgumentException ( " count <0 " );
        this .sync = nueva sincronización (recuento); 
    }
        Sync ( int count) { 
            setState (count); 
        }

  Cuando un hilo en la aplicación de la CountDownLatch  . El await ()  después de que el método será bloque de hilado determinar si el estado es 0. El estado se reduce mediante el  método .countDown () de  CountDownLatch .

    public  void countDown () { 
        sync.releaseShared ( 1 ); 
    }

Escenario de uso

  Por ejemplo, si se requieren varios subprocesos para calcular varias hojas, y finalmente los resultados deben resumirse, puede ejecutar await () en el hilo principal y ejecutar countDown () después del cálculo de cada hoja.

Barrera Cíclica

Principio de introducción

  Existen dos métodos de construcción para la barrera de sincronización CyclicBarrier.

  En el primer tipo, los parámetros solo pasan números enteros.

    public CyclicBarrier ( int fiestas) {
         this (fiestas, nulo ); 
    }

  El segundo tipo, el parámetro también necesita pasar un hilo para lograr

    public CyclicBarrier ( int Parties, Runnable barreraAction) {
         if (parties <= 0 ) arroja una  nueva IllegalArgumentException ();
        esto .parties = fiestas;
        esto .count = fiestas;
        this .barrierCommand = barreraAcción; 
    }

  CyclicBarrier llamándolo  . El await ()  , el método de bloqueo hilo actual, sus variables miembro internos reentrante cerradura.

  El primero:

  1. Suponga que el parámetro pasa 2, el subproceso ejecuta el método await () , el subproceso 1 primero toma el bloqueo y luego disminuye el parámetro de la parte en 1 y luego determina si es 0. Si es 0, se ejecuta la lógica detrás del subproceso.

  2. Si no es 0, llame al método trip () de Condition, el método trip () liberará el bloqueo y esperará. En este momento, el subproceso 2 puede tomar el bloqueo y luego ejecutar la lógica en el paso 1. En este momento, menos 1 para las partes es 0. En este momento , se llamará al método de condición signalAll () para notificar al hilo del método trip () para continuar la ejecución

  El segundo tipo:

  El parámetro no solo pasó 2 sino que también pasó en otro subproceso (alias obtenido C). De hecho, la lógica general es similar a la primera, excepto que después de que se considera que la parte 1 es 0 en el paso 1, primero ejecutará la lógica del subproceso C y luego activará los otros dos subprocesos.

Escenario de uso

Semáforo

Principio de introducción

  Al construir Semaphore, se requiere el parámetro de modelado, que indica cuántos hilos permite ejecutar en paralelo.

    pública semáforo ( int permisos) { 
        sincronización = nuevos NonfairSync (permisos); 
    }

  Necesita ejecutar semaphore.acquire () en el hilo para   obtener la licencia, luego el estado de sincronización responderá al cambio y luego ejecutar  sync.releaseShared ( 1 ) para  liberar la licencia, otros hilos pueden obtener la licencia

Escenario de uso

  Diversos escenarios que requieren limitar el número de subprocesos. Por ejemplo, en escenarios de agrupación de conexiones, el número de subprocesos debe ser limitado.

Intercambiador

Escenario de uso

  Intercambiar datos entre hilos

Supongo que te gusta

Origin www.cnblogs.com/lcmlyj/p/12751008.html
Recomendado
Clasificación