Las instrucciones de CountdownLatch son para su referencia. El contenido específico es el siguiente
CountdownLatch es una clase de herramientas de sincronización Java.util.concurrent Siguiente que permite que uno o más subprocesos esperen hasta que se complete un conjunto de operaciones en otros subprocesos.
El uso de CountdownLatch es muy simple. El siguiente ejemplo también es lo que vi en línea, y es muy apropiado. Lo publicaré aquí.
prueba de clase pública {public static void main (string [] args) {CountDownLatch begin = new CountdownLatch (1); CountDownLatch final = new CountdownLatch (2); for (int i = 0; i <2; i ++) {Thread Thread = New Thread (New Player (Begin, End)); Thread.Start (); } try {System.out.println ("The Race Begin"); begin.countdown (); end.await (); System.out.println ("The Race End"); } catch (Exception e) {E.PrintStackTrace (); }}}/*** Player*/Class Player implementa Runnable {private CountdownLatch begin; Fin privado CountdownLatch; Player (CountdownLatch Begin, CountdownLatch End) {this.begin = begin; this.end = end; } public void run () {try {begin.await (); System.out.println (Thread.CurrentThread (). GetName () + "Llegó!") ;; end.countdown (); } catch (InterruptedException e) {E.PrintStackTrace (); }}}A continuación se presentan los resultados de ejecución
Puede ver que a través del uso de CountdownLatch, controlamos la orden de ejecución de los subprocesos.
En el código anterior, usamos el método Await () y el método Countdown (). Verifiquemos sus respectivas funciones.
Primero verifique el método Await (). Comenta el End.Await () en el método principal. El siguiente es el resultado de la ejecución después de comentar.
Puede ver que el hilo principal no esperó que el hilo que represente al concursante terminara, ¡y anunció directamente que la competencia había terminado! El juego que terminó al principio ---
Se puede ver aquí que el método Await () tiene un efecto de bloqueo
En segundo lugar, verifiquemos el método Countdown y comentemos en el End.CountDown () en el hilo del concursante. El siguiente es el resultado de ejecución.
El programa ha estado funcionando, y todos los jugadores han alcanzado la línea de meta, pero el árbitro simplemente no promueve el final del juego. ¿Qué está esperando?
Suponemos que el método Countdown () tiene el efecto de despertar el hilo de bloqueo.
Entonces podemos preguntar, ya que tiene la función de despertar el hilo de bloqueo, ¿no es posible despertar el hilo principal bloqueado si solo llamamos al método Countdown () una vez?
Intentemos, desenchufe la anotación de CoutDown () anterior, cree un jugador nuevamente, el código es el siguiente
Clase Player2 implementa Runnable {private CountdownLatch Begin; Fin privado CountdownLatch; Player2 (CountdownLatch Begin, CountDownLatch End) {this.begin = begin; this.end = end; } public void run () {try {begin.await (); System.out.println (Thread.CurrentThread (). GetName () + "Llegó!"); // end.countDown (); } catch (InterruptedException e) {E.PrintStackTrace (); }}}El método principal también se modifica de la siguiente manera, creando dos jugadores diferentes.
public static void main (string [] args) {CountDownLatch begin = new CountdownLatch (1); CountDownLatch final = new CountdownLatch (2); Hilo de hilo = nuevo hilo (nuevo reproductor (begin, end)); Thread.Start (); Thread Thread2 = New Thread (New Player2 (Begin, End)); thread2.start (); intente {System.out.println ("The Race Begin"); begin.countdown (); end.await (); System.out.println ("The Race End"); } catch (Exception e) {E.PrintStackTrace (); }}Ejecutarlo, aquí están los resultados
El programa principal ha sido bloqueado y no ha sido despertado. ¡El árbitro ha estado usando el inodoro por un tiempo!
Parece que Countdown () no despierta directamente el hilo, es un poco como un contador, cuenta regresiva.
Verifique la documentación de la API, efectivamente, agregamos el Parámetro 2 al constructor, y necesitamos llamar a Countdown () 2 veces para despertar el hilo bloqueado de end.await ().
CountDownLatch final = new CountdownLatch (2);
Para resumir,
1. CountdownLatch End = New CountdownLatch (n); // Al construir un objeto, debe pasar en el parámetro N.
2. End.Await () puede bloquear los hilos hasta que el método final.
3. End.CountDown () se puede llamar en múltiples hilos para calcular el número de llamadas que son la suma de todos los hilos.
En el próximo blog, explicaré cómo funciona CountdownLatch desde el nivel del código fuente.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.