As instruções CountdownLatch são para sua referência. O conteúdo específico é o seguinte
O CountdownLatch é um pacote Java.util.COncurrent Próximo classe de ferramenta de sincronização que permite que um ou mais threads esperem até que um conjunto de operações seja concluído em outros threads.
O uso do Countdownlatch é muito simples. O exemplo a seguir também é o que vi online e é muito apropriado. Vou postar aqui.
public class Test {public static void main (string [] args) {CountdownLatch BEGIN = new CountdownLatch (1); Countdownlatch end = new Countdownlatch (2); para (int i = 0; i <2; i ++) {thread thread = new Thread (novo player (começo, end)); thread.start (); } tente {System.out.println ("A corrida começa"); Begin.CountDown (); end.await (); System.out.println ("The Race End"); } catch (Exceção e) {e.printStackTrace (); }}}/*** Player*/Class Player implementa Runnable {Private CountdownLatch BEGN; End de contagem regressiva privada; Player (CountDownLatch BEGN, CountdownLatch end) {this.Begin = BEGIN; this.end = end; } public void run () {try {Begin.await (); System.out.println (thread.currentThread (). GetName () + "chegou!") ;; end.countdown (); } catch (interruptedException e) {e.printStackTrace (); }}}Abaixo estão os resultados em execução
Você pode ver que, através do uso do Countdownlatch, controlamos a ordem de execução dos threads.
No código acima, usamos o método Await () e o método Countdown (). Vamos verificar suas respectivas funções.
Primeiro, verifique o método aguardar (). Comente o final.await () no método principal. A seguir, é apresentado o resultado da execução depois de comentar.
Você pode ver que o tópico principal não esperou que o tópico representasse o competidor termine e anunciou diretamente que a competição havia terminado! O jogo que terminou no começo ---
Pode -se ver aqui que o método aguardar () tem um efeito de bloqueio
Em segundo lugar, vamos verificar o método da contagem regressiva e comentar no final.countdown () no tópico do concorrente. O seguinte é o resultado em execução.
O programa está em execução e todos os jogadores chegaram à linha de chegada, mas o árbitro simplesmente não promove o final do jogo. O que ele está esperando?
Acreditamos que o método Countdown () tem o efeito de acordar o segmento de bloqueio.
Então, podemos perguntar, uma vez que tem a função de acordar o segmento de bloqueio, não é possível acordar o encadeamento principal bloqueado se chamarmos apenas o método Countdown () uma vez?
Vamos tentar, descomentar a anotação acima coutdown (), criar um jogador novamente, o código é o seguinte
Classe player2 implementa runnable {private CountDownLatch BEGN; End de contagem regressiva privada; Player2 (BEGN CountdownLatch BEGIN, CountdownLatch final) {this.Begin = BEGIN; this.end = end; } public void run () {try {Begin.await (); System.out.println (thread.currentThread (). GetName () + "chegou!"); // end.countdown (); } catch (interruptedException e) {e.printStackTrace (); }}}O método principal também é modificado da seguinte maneira, criando dois jogadores diferentes
public static void main (string [] args) {Countdownlatch BEGIN = new CountdownLatch (1); Countdownlatch end = new Countdownlatch (2); Thread Thread = novo thread (novo jogador (BEGIN, FINAL)); thread.start (); Thread Thread2 = novo Thread (novo player2 (BEGIN, END)); Thread2.start (); tente {System.out.println ("a corrida começa"); Begin.CountDown (); end.await (); System.out.println ("The Race End"); } catch (Exceção e) {e.printStackTrace (); }}Execute -o, aqui estão os resultados
O programa principal foi bloqueado e não foi despertado. O árbitro usa o banheiro há um tempo!
Parece que o Countdown () não acorda diretamente o thread, é um pouco como um contador, contagem regressiva.
Verifique a documentação da API, com certeza, adicionamos o parâmetro 2 ao construtor, e precisamos chamar Countdown () 2 vezes para acordar o encadeamento bloqueado de end.await ().
Countdownlatch end = new Countdownlatch (2);
Resumindo,
1. Countdownlatch end = new Countdownlatch (n); // Ao construir um objeto, você precisa passar no parâmetro N.
2. End.await () pode bloquear os threads até que o método end.CountDown () seja chamado N vezes antes da liberação do thread.
3. End.countdown () pode ser chamado em vários threads para calcular o número de chamadas que são a soma de todos os threads.
No próximo blog, explicarei como o CountdownLatch funciona do nível do código -fonte.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.