A fechadura é equivalente a uma porta. Antes de atingir o estado final, a porta está sempre fechada e nenhum fio pode passar. Quando o estado final for alcançado, a porta abrirá e permitirá a passagem de todos os fios. Pode fazer um ou mais threads aguardarem a ocorrência de um conjunto de eventos. O estado de travamento consiste em um contador, inicializado com um número formal positivo que indica o número de eventos a serem esperados. O método countDown decrementa o contador, indicando que ocorreu um evento, enquanto o método await espera que o contador chegue a 0, indicando que o evento esperado ocorreu. CountDownLatch enfatiza que um thread (ou vários threads) precisa esperar que outros n threads concluam algo antes de continuar a execução.
Aplicação de cenário:
10 atletas se preparam para correr. Aguardam a ordem do árbitro e começam a correr ao mesmo tempo. Quando a última pessoa passa a linha de chegada, o jogo termina. 10 movimentos equivalem a 10 threads. A chave aqui é controlar 10 threads para serem executados ao mesmo tempo e como determinar quando o último thread atingiu o ponto final. Dois bloqueios podem ser usados. O primeiro bloqueio é usado para controlar 10 threads que aguardam a ordem do árbitro, e o segundo bloqueio controla o final do jogo.
importar java.util.concurrent.CountDownLatch; classe Aworker implementa Runnable { private int num; private CountDownLatch start; private CountDownLatch end; = start; this.end = end } @Override public void run() { // TODO stub de método gerado automaticamente try { System.out.println(num + "a pessoa está pronta"); //Ready} catch (InterruptedException e) { e.printStackTrace(); contador diminui em um e atinge o ponto final System.out.println(num + "as pessoas chegam"); public class Race { public static void main(String[] args) { int num = 10; CountDownLatch começar = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { new Thread(new Aworker(i, start, end)).start() ; } tente { Thread.sleep((long) (Math.random() * 5000)); Bloco catch gerado automaticamente e1.printStackTrace(); } System.out.println("juiz diz: run!"); //Começa a correr após o árbitro dar a ordem longa startTime = System.nanoTime( ); try { end.await(); //Aguarde o final} catch (InterruptedException e) { // TODO bloco de captura gerado automaticamente e.printStackTrace() } finalmente { long endTime =; System.nanoTime(); System.out.println("juiz diz: tudo chegou!"); System.out.println("gastar tempo: " + (endTime - startTime));
saída
1ª pessoa está pronta2ª pessoa está pronta4ª pessoa está pronta6ª pessoa está pronta3ª pessoa está pronta10ª pessoa está pronta8ª pessoa está pronta5ª pessoa está pronta7ª pessoa está pronta9ª pessoa está prontajuiz diz: corra!1ª pessoa chega4ª pessoa chega10ª pessoa chega5ª pessoa chega2ª pessoa chegajuiz diz: todos chegaram !9ª pessoas chegam7ª pessoas chegam8ª pessoas chegam3ª pessoas chegam6ª pessoas chegampend time: 970933