JAvaのCountDownLatch

4811 ワード

ロックは、スレッドが終了するまでスレッドの進行を遅らせる同期ツールクラスです.閉鎖の役割はドアに相当します.閉鎖が終了状態に達すると価値があり、このドアはずっと閉鎖され、スレッドが通過することはありません.大きな終了状態になると、このドアは開き、すべてのスレッドが通過することを許可します.ロックが終了すると、ステータスは変更されません.したがって、ドアは常に開いたままになります.
ロックは、他のアクティビティが完了するまで実行を続行するアクティビティを確保するために使用できます.たとえば、次のようにします.
  1.計算が必要なすべてのリソースが初期化されてから実行されることを確認します.
  2.期間中の他のすべてのサービスが開始されてから、サービスが開始されることを確認します.
  3.操作のすべての参加者が準備が整うまで待機します.
 
CountDownLatchは柔軟な閉鎖実装であり、上記の様々な状況で使用することができ、上記の様々な状況で使用することができる.countDownメソッドはカウンタを減算し、すでに1つの時間が発生していることを示し、awaitメソッドはカウンタが0に達するのを待っています.これはすべてのことが発生していることを示しています.カウンタがゼロでない場合、awaitはカウンタが0になるまでブロックされます.または、待機中のスレッドが中断されたり、タイムアウトを待機したりします.
 
プログラム、タイミングテストでCountDownLatchを使用してスレッドを起動および停止
  
package concurrent.learn;

import java.util.concurrent.CountDownLatch;



public class TestHarness {

    public long timeTasks(int nThreads, final Runnable task) throws InterruptedException {

        final CountDownLatch startGate = new CountDownLatch(1);

        final CountDownLatch endGate = new CountDownLatch(nThreads);



        for (int i = 0; i < nThreads; i++) {

            Thread t = new Thread(new Runnable() {



                @Override

                public void run() {

                    try {

                        startGate.await();

                        try {

                            task.run();

                        } finally {

                            endGate.countDown();

                        }

                    } catch (InterruptedException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }



                }

            });

            t.start();

        }

        long start = System.nanoTime();

        startGate.countDown();

        endGate.await();

        long end = System.nanoTime();

        

        return end -start;

        



    }

    

    public static void main(String[] args) throws InterruptedException {

        Runnable r = new Runnable() {

            

            @Override

            public void run() {

                System.out.println(555);

                

            }

        };

        TestHarness t = new TestHarness();

        long time = t.timeTasks(5, r);

        

        System.out.println(time);

        

    }

}

startGateのカウンタ初期値は1であり、終了ゲートのカウンタ初期値は動作スレッドの数である.各作業スレッドは、まずstartGateで待機し、すべてのスレッドが準備されてから実行が開始されることを確認します.各スレッドが行う最後のことは、endGateのcountDownメソッドを呼び出して1を減らすことです.これにより、すべての作業スレッドが完了するまでメインスレッドを効率的に待つことができ、消費された時間を統計することができます.