CountDownLatchマルチタスクプロセッサ


CountDownLatchはjavaから提供された同期カウンタであり、字面の意味ではCountDownとLatchの2つの部分に分けることができ、CountDownはカウントの意味であり、Latchはラッチであり、この同期ツールはマルチスレッド環境を保証することによって、ラッチによってメインスレッドの実行を制限し、サブスレッドの実行後にカウントを0に減らし、ラッチが開くまで減少する.メインスレッドが実行されます.
シーン1:メインタスクは、他のサブタスクが完了してから実行されます.
背景:映画館は全員がそろってから映画を放送するのを待っています.映画館のクラスがメインスレッドで、映画を見る人がサブスレッドで、映画館が5人を収容して映画を見ることができると仮定して、次のクラスはCountDownLatchを利用してこの機能を実現します.
public class Cinema {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(5);
        ExecutorService executor = Executors.newFixedThreadPool(3);
        for(int i=0; i<5; i++){
            executor.execute(new Person(countDownLatch));
        }

        System.out.println("        ...");
        //      ,        0
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("    ,      ...");
    }
}
public class Person implements Runnable{
    private CountDownLatch countDownLatch;
    public Person(CountDownLatch countDownLatch){
        this.countDownLatch = countDownLatch;
    }


    @Override
    public void run() {
        try {
            Thread.sleep((long) (Math.random() * 0));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(String.format("%s       ", Thread.currentThread().getId()));
        countDownLatch.countDown();
        System.out.println(String.format("%s  %s    ", Thread.currentThread().getId(), countDownLatch.getCount()));
    }
}

実行結果:
        ...
13       
11       
12       
11  3    
13  4    
12  2    
13       
11       
13  1    
    ,      ...
11  0    

この时、现実を考えてみてください.いつでも映画馆が満席で映画を上映するわけではありません.では、时间を设ける必要があります.もし时間になっても人がそろっていなければ、映画を放送し始めます.このプログラムはどう书きますか.
public class Cinema {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(10);
        ExecutorService executor = Executors.newFixedThreadPool(3);
        for(int i=0; i<5; i++){
            executor.execute(new Person(countDownLatch));
        }

        System.out.println("        ...");
        //      ,        0
        try {
            countDownLatch.await(300, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("    ,      ...");
    }
}

ここではCountDownLatchのawaitのもう一つのリロード方法を用い,CountDownLatchのしきい値を増やし,データの走りやすさを向上させた.結果:
        ...
12       
13       
13  8    
12  9    
11       
11  7    
12       
12  6    
13       
13  5    
    ,      ...

まだ5人が来ていないことに気づいたとき、映画が放送され始めました.素晴らしいのではないでしょうか.ここで注意しなければならないのは、マルチスレッド環境で異常に注意しなければならないことです.異常が発生した場合、データの一貫性をどのように保証するか、メインスレッドがロールバック処理を行うかどうかです.マルチスレッドを用いてパフォーマンスの向上を実現する場合、スレッドのセキュリティに問題があるに違いありません.