JAVAマルチスレッドCountDownLatch使用詳細


前の順序:
先週、開発した同僚が開発したモジュールにバグを提出しました。
コードをよく調べてみると、業務でマルチスレッドを有効にし、2スレッドを同時に実行していますが、新たに起動する2つのスレッドは完成した後、もう1つのスレッドが再起動してこそ、バグを解消することができます。
いつ使いますか?
マルチスレッドは多くのところで使われていますが、私たちはある特定のスレッドを実行した後、もう一つのスレッドを起動したいです。この時、CountDownLatchが役に立ちます。
どう使いますか?
まず普通のマルチスレッドコードを見てください。

package code;

public class MyThread extends Thread { 
  public static void main(String[] args) {   
    MyThread th = new MyThread();  
    Thread t1 = new Thread(th, "Mythread");    
    t1.start(); 
    System.out.println(Thread.currentThread().getName()); 
    }    
    public void run() 
      {   
        Mythread1 th2 = new Mythread1();  
        Thread t2 = new Thread(th2, "Mythread1");    
        t2.start(); 
        System.out.println(this.currentThread().getName()); 
      } 
    class Mythread1 extends Thread
    {
      public void run() {  
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        System.out.println(this.currentThread().getName()); 
        } 
      
    }
  }
コードは上記の通り、先にMyThreadでThread類を継承し、MyThread類の内部にMyThread 1類を書きました。同様にThread類を継承し、run方法で1秒眠らせます。このようにコードを実行すると、プリントされます。

上記の出力順序からは、まずメインスレッドを起動してからMyThreadスレッドを起動し、MyThreadスレッドの中でMyThread 1スレッドを起動したことが分かります。しかし、MyThread 1スレッドを1秒寝かせたので、その後の業務をシミュレーションして処理すると、MyThreadの運転が完了した時間より少し遅くなります。
現在、コードにCountDownLatchを入れて、MyThread 1を先に運転してから、MyThreadを実行させます。

package code;

import java.util.concurrent.CountDownLatch;

public class MyThread extends Thread { 
  CountDownLatch countDownLatch = new CountDownLatch(1);
  public static void main(String[] args) {   
    MyThread th = new MyThread();  
    Thread t1 = new Thread(th, "Mythread");    
    t1.start(); 
    System.out.println(Thread.currentThread().getName()); 
    }    
    public void run() 
      {   
        Mythread1 th2 = new Mythread1();  
        Thread t2 = new Thread(th2, "Mythread1");    
        t2.start(); 
        try {
          countDownLatch.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(this.currentThread().getName()); 
      } 
    class Mythread1 extends Thread
    {
      public void run() {  
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(this.currentThread().getName()); 
        countDownLatch.countDown();
        } 
      
    }
  }
コードの書き方は上のように大体3段階に分けます。
1、私たちはまずnew CountDownLatchのオブジェクトを1に設定します。(私の個人的にはこれはnewの配列のようです。いつ配列が空になりますか?中断されたスレッドを続行します。)
2、MyThread類でcountDownLatch.await()を呼び出します。現在のスレッドを停止させます。
3、Mythread 1クラスでcountDownLatDownメソッドを呼び出します。Mythread 1が全部実行されたら、最後にこの方法を呼び出すと、私が言った「配列」を空にする役割があります。
出力の印刷結果を見てください。

結果は上の図のように、予想通りの結果です。
最後にCountDownLatch countDownLatch=new CountDownLatch(1)の入力を言います。この設定は1です。countDownLatch.comを一回呼び出す必要があります。
他の数字であれば、該当回数を呼び出します。そうでなければ、countDownLatch.awaitを呼び出すスレッドは実行されません。
 以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。