La cerradura es equivalente a una puerta. Antes de que la cerradura alcance el estado final, la puerta siempre está cerrada y ningún hilo puede pasar. Cuando se alcanza el estado final, la puerta se abrirá y permitirá que pasen todos los hilos. Puede hacer que uno o más subprocesos esperen a que ocurra una serie de eventos. El estado de bloqueo consiste en un contador, inicializado a un número positivo formal que indica la cantidad de eventos a esperar. El método countDown disminuye el contador, lo que indica que ha ocurrido un evento, mientras que el método await espera a que el contador llegue a 0, lo que indica que ha ocurrido el evento esperado. CountDownLatch enfatiza que un subproceso (o varios subprocesos) deben esperar a que otros n subprocesos completen algo antes de continuar con la ejecución.
Aplicación de escenario:
10 atletas se preparan para correr, esperan la orden del árbitro y comienzan a correr al mismo tiempo. Cuando la última persona pasa la línea de meta, el juego termina. 10 movimientos equivalen a 10 subprocesos. La clave aquí es controlar la ejecución de 10 subprocesos al mismo tiempo y cómo determinar cuándo el último subproceso ha llegado al punto final. Se pueden usar dos candados. El primer candado se usa para controlar 10 hilos que esperan la orden del árbitro y el segundo candado controla el final del juego.
importar java.util.concurrent.CountDownLatch; clase Aworker implementa Runnable {privado int num; privado CountDownLatch fin; privado Aworker (int num, final CountDownLatch final) { this.num = num; = comenzar; this.end = end; } @Override public void run() { // TODO Método generado automáticamente stub try { System.out.println(num + "ésima gente está lista"); comenzar.await(); //Listo} catch (InterruptedException e) { e.printStackTrace(); finalmente { end.countDown(); el contador disminuye en uno y llega al punto final System.out.println(num + "ésima gente llega"); public class Race { public static void main(String[] args) { int num = 10; CountDownLatch comienza = nuevo CountDownLatch(1); fin de CountDownLatch = nuevo CountDownLatch(num); } intentar { Thread.sleep((long) (Math.random() * 5000)); catch (InterruptedException e1) { // TODO Bloque de captura generado automáticamente e1.printStackTrace(); } System.out.println("el juez dice: ¡corre!"); //Comienza a correr después de que el árbitro dé la orden long startTime = System.nanoTime( ); try { end.await(); //Esperar el final} catch (InterruptedException e) { // TODO Bloque de captura generado automáticamente e.printStackTrace() } finalmente { long endTime = System.nanoTime(); System.out.println("el juez dice: ¡todo llegó!"); System.out.println("dedique tiempo: " + (endTime - startTime));
producción
La 1.ª gente está lista. La 2.ª gente está lista. La 4.ª gente está lista. La 6.ª gente está lista. La 3.ª gente está lista. La 10.ª gente está lista. La 8ª gente está lista. !Llega la novena personaLlega la séptima personaLlega la octava personaLlega la tercera personaLlega la sexta personapensar tiempo: 970933