Se puede traducir como Latch Countdown (Countdown). No hace falta decir que el pestillo significa, como su nombre lo indica, para evitar el progreso. Aquí significa que el método CountdownLatch.AWAIT () bloqueará el hilo actual antes de que la cuenta regresiva sea 0.
CountdownLatch es una clase de ayuda sincrónica que permite que uno o más hilos esperen hasta que se realice un conjunto de operaciones en otros hilos.
CountdownLatch funciona de manera similar al método Thread.Join (), y se puede utilizar para la colaboración entre un grupo de hilos y otro grupo de hilos. Por ejemplo, el hilo principal necesita una serie de preparaciones antes de hacer un trabajo, y solo si se completan todas estas preparaciones, el hilo principal puede continuar su trabajo. Estas preparaciones son independientes entre sí, por lo que se pueden ejecutar simultáneamente para aumentar la velocidad. En este escenario, CountdownLatch se puede usar para coordinar la programación entre hilos. En la época en que los hilos se crearon directamente (antes de Java 5.0), podemos usar Thread.Join (). Después de que aparece JUC, debido a que los hilos en el grupo de subprocesos no se pueden hacer referencia directamente, se debe usar CountdownLatch.
La clase CountdownLatch es un mostrador sincrónico. Al construir, se pasa el parámetro int. Este parámetro es el valor inicial del contador. Cada vez que se llama al método Countdown (), el contador se disminuye por 1 y el contador es mayor que 0, el método APEAI () bloqueará el programa y continuará la ejecución. CountdownLatch puede considerarse como un pestillo de cuenta regresiva, lo que desencadena un evento específico cuando el recuento se reduce a 0. Usando esta función, el hilo principal puede esperar el final del hilo infantil. El siguiente es un ejemplo de una competencia de atletas simulados.
Un escenario de aplicación muy típico de CountdownLatch es: hay una tarea que quiere ser ejecutada hacia abajo, pero debe esperar hasta que se ejecuten otras tareas antes de que pueda continuar ejecutándose hacia abajo. Si nuestra tarea de que queremos continuar ejecutando más llamadas al método await () del objeto CountDownLatch, y las otras tareas llaman al método Countdown () en el mismo objeto CountdownLatch después de ejecutar sus propias tareas, la tarea que llama al método ATEAT () seguirá bloqueando y esperando hasta que el valor de CountDownLatch disminuya a 0.
Lista de funciones de CountdownLatch
CountdownLatch (int count) construye un recuento inicializado con un recuento dado. // Haga que el hilo actual espere hasta que el pestillo cuente a cero, a menos que el hilo se interrumpe. void await () // hace que el hilo actual espere hasta que el pestillo cuente a cero, a menos que se interrumpa el hilo o se exceda el tiempo de espera especificado. Boolean espera (tiempo de espera largo, unidad de tiempo de tiempo) // disminuye el recuento del pestillo. Si el recuento alcanza cero, se lanzarán todos los hilos de espera. Void Countdown () // Devuelve el recuento actual. Long getCount () // Devuelve una cadena que identifica este pestillo y su estado. Cadena toString ()
Estructura de datos de CountdownLatch
El diagrama de clase UML de CountdownLatch es el siguiente:
La estructura de datos de CountdownLatch es simple, se implementa a través de "bloqueos compartidos". Contiene objetos de sincronización, Sync es el tipo de sincronización. Sync es una clase de instancia, que hereda de AQS.
Ejemplo de CountdownLatch
Lo siguiente se implementa a través de CountdownLatch: "El hilo principal" espera "5 hilos infantiles" para completar el "trabajo especificado (1000 ms)" antes de continuar ejecutándose.
import java.util.concurrent.countdownlatch; import java.util.concurrent.cclicbarrier; public class CountdownLatchTest1 {private static int latch_size = 5; Donesignal privado estático CountdownLatch; public static void main (string [] args) {try {donesignal = new CountdownLatch (Latch_Size); // Crear 5 nuevas tareas para (int i = 0; i <latch_size; i ++) new InnerThread (). Start (); System.out.println ("Principal espera comienza"); // El "hilo principal" espera la finalización de 5 tareas en el grupo de subprocesos para completar donesignal.await (); System.out.println ("Principal espera terminado"); } catch (InterruptedException e) {E.PrintStackTrace (); }} La clase estática InnerThread extiende el hilo {public void run () {try {thread.sleep (1000); System.out.println (Thread.CurrentThread (). GetName () + "Sleep 1000ms."); // reste el valor de CountdownLatch por 1 donesignal.countDown (); } catch (InterruptedException e) {E.PrintStackTrace (); }}}} Resultados de ejecución:
Principal espera.
La descripción del resultado: el hilo principal usa Donesignal.Await () para esperar a que otros hilos disminuyan Donesignal a 0. Los otros 5 hilos de lectura interna, cada uno de ellos resta el valor de donesignal por 1 a través de donesignal.countdown (); Cuando Donesignal sea 0, Main continuará ejecutándose después de ser despertado.
PD: Diferencia entre CountdownLatch y CyclicBarrier:
(1) La función de CountdownLatch es permitir que 1 o n hilos esperen a que otros hilos completen la ejecución; Mientras que CyclicBarrier permite que los h hreads se esperen unos a otros.
(2) el contador de CountdownLatch no se puede restablecer; El mostrador de CyclicBarrier se puede usar después del reinicio, por lo que se llama barrera en bucle.