Prefácio:
O teste na semana passada levantou um bug para o módulo desenvolvido pelos colegas de desenvolvimento, e ainda era uma coincidência.
Depois de verificar cuidadosamente o código, descobri que o multi-threading está ativado no negócio e 2 threads são executados ao mesmo tempo, mas os dois threads iniciados devem garantir que um seja concluído e o outro continue a ser executado para eliminar o bug.
Quando usá -lo?
O multithreading é usado em muitos lugares, mas se quisermos iniciar outro thread após a conclusão de um thread específico, o CountdownLatch pode ser útil.
Como usá -lo?
Vamos dar uma olhada no código multithread comum:
Código do pacote; classe pública mythread estende thread {public static void main (string [] args) {mythread th = new mythread (); Thread t1 = novo thread (th, "mythread"); t1.start (); System.out.println (thread.currentThread (). GetName ()); } public void run () {mythread1 th2 = new mythread1 (); Thread T2 = novo thread (Th2, "Mythread1"); t2.start (); System.out.println (this.currentThread (). GetName ()); } classe mythread1 estende thread {public void run () {try {thread.sleep (1000); } catch (interruptedException e) {// TODO BLOCO DE CATCH AUTOGERATIDO E.PRINTSTACKTRACE (); } System.out.println (this.currentThread (). GetName ()); }}}O código é como acima. Primeiro, use o Mythread para herdar a classe Thread e depois escreva outra classe Mythread1 dentro da classe Mythread, que também herda a classe Thread, e deixa dormir por 1 segundo no método de execução. Dessa forma, o código será impresso:
A partir da ordem de saída acima, podemos ver que o thread principal é iniciado pela primeira vez e, em seguida, o thread do mythread é iniciado. No thread mythread, o thread mythread1 é iniciado. No entanto, como o thread mythread1 dormiu por 1 segundo, ele simulou o processamento dos negócios subsequentes, por isso seria um pouco mais tarde do que o Mythread foi concluído.
Agora, adicione o CountdownLatch ao código e deixe o mythread1 executar primeiro e depois deixe o Mythread continuar a executar.
Código do pacote; importar java.util.concurrent.countdownlatch; public class Mythread estende thread {CountdownLatch Countdownlatch = new CountdownLatch (1); public static void main (string [] args) {mythread th = new mythread (); Thread t1 = novo thread (th, "mythread"); t1.start (); System.out.println (thread.currentThread (). GetName ()); } public void run () {mythread1 th2 = new mythread1 (); Thread T2 = novo thread (Th2, "Mythread1"); t2.start (); tente {Countdownlatch.await (); } catch (interruptedException e) {e.printStackTrace (); } System.out.println (this.currentThread (). GetName ()); } classe mythread1 estende thread {public void run () {try {thread.sleep (1000); } catch (interruptedException e) {e.printStackTrace (); } System.out.println (this.currentThread (). GetName ()); CountdownLatch.CountDown (); }}}O método de escrita de código é mostrado acima, dividido aproximadamente em três etapas
1. Vamos primeiro parâmetro de objeto de contagem regressivo definido como 1 (eu pessoalmente entendo isso é como uma nova matriz. Quando a matriz é limpa, o tópico interrompido pode continuar a executar)
2. Call Countdownlatch.await () na classe Mythread; para parar de executar o thread atual.
3. Ligue para o método CountdownLatch.CountDown () na classe Mythread1. Quando todo o mythread1 é executado e o método é finalmente chamado, a função é limpar a "matriz" que mencionei.
Confira os resultados da impressão da saída
Os resultados são mostrados na figura acima, que estão alinhados com os resultados esperados.
Finalmente, vamos falar sobre CountdownLatch Countdownlatch = new Countdownlatch (1). Defina 1 nesta área, então você precisa ligar para o Countdownlatch.CountDown () uma vez para subtrair 1.
Se for outro número, o número correspondente de vezes deve ser chamado, caso contrário, o thread Calling CountDownLatch.await () não será executado.
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.