JAva-マルチスレッド-CyclicBarrier(ループフェンス)

4333 ワード

  • CyclicBarrier
  • CyclicBarrier barrier = new CyclicBarrier(8);
  • CyclicBarrierは私たちの陸上競技のスタートラインと理解でき、8つの滑走路
  • を定義しています.
  • は8つの滑走路に人がいなければ
  • を走ることができないと要求した.
  • 7人が来たら、7人はスタートラインで待たなければなりません.8人が集まってから
  • を走ることができます.
  • もし9人が来たら、この9人の中から8人を選んで走り、1人を残して8人が集まってから
  • を走り続けます.
  • これがCyclicBarrierの役割であり、await()メソッドを呼び出すのはスタートラインルールが有効になる
  • である.
  • await():現在のスレッドをブロックし、ブロックされたスレッドの数を監視し、要求数に達した後、
  • を統一的に放行する.
  • 簡単な例で
  • を見てみましょう
  • シーン:私たちは今10小分隊を集めて戦争に行きます.すべての人が集合点に着いたら、一緒に
  • に出発するように要求します.
    //     
    public class ThreadMarch implements Runnable{
        //   
        private String name;
        //          
        private CyclicBarrier barrier;
    
        public ThreadMarch(String name, CyclicBarrier barrier) {
            this.name = name;
            this.barrier = barrier;
        }
    
        @Override
        public void run() {
            try {
                System.out.println(this.name+"        。。。");
                Thread.sleep(2000);
                System.out.println(this.name+"      !");
                //       ;await()       ,        ,             
                barrier.await();
                //       ,    
                System.out.println(this.name+"    !");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        //        
        ExecutorService executor = Executors.newFixedThreadPool(12);
        //     10    ,barrier       10       
        CyclicBarrier barrier = new CyclicBarrier(10);
        try {
            executor.execute(new ThreadMarch("  ",barrier));
            executor.execute(new ThreadMarch("  ",barrier));
            executor.execute(new ThreadMarch("  ",barrier));
            executor.execute(new ThreadMarch("  ",barrier));
            executor.execute(new ThreadMarch("   ",barrier));
            executor.execute(new ThreadMarch("  ",barrier));
            executor.execute(new ThreadMarch("  ",barrier));
            executor.execute(new ThreadMarch("   ",barrier));
            executor.execute(new ThreadMarch("   ",barrier));
            executor.execute(new ThreadMarch("  ",barrier));
    
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }
    
      :
              。。。
              。。。
               。。。
               。。。
               。。。
              。。。
              。。。
              。。。
              。。。
              。。。
            !
             !
             !
             !
            !
            !
            !
            !
            !
            !
          !
          !
           !
           !
           !
          !
          !
          !
          !
          !
     
  • 全員が集合場所に着いてから出発しているのが見えます.
  • 使用しない場合 CyclicBarrierは?それは待たずに、先に着いた人が出発します.
  • public class ThreadMarch implements Runnable{
        //   
        private String name;
        //          
        private CyclicBarrier barrier;
    
        public ThreadMarch(String name, CyclicBarrier barrier) {
            this.name = name;
            this.barrier = barrier;
        }
    
        @Override
        public void run() {
            try {
                System.out.println(this.name+"        。。。");
                Thread.sleep(2000);
                System.out.println(this.name+"      !");
                //       ;await()       ,        ,             
    //            barrier.await();
                //       ,    
                System.out.println(this.name+"    !");
            } catch (InterruptedException e) {
                e.printStackTrace();
    //        } catch (BrokenBarrierException e) {
    //            e.printStackTrace();
            }
        }
    }
    
      :
              。。。
              。。。
               。。。
              。。。
               。。。
              。。。
               。。。
              。。。
              。。。
              。。。
            !
          !
             !
           !
            !
          !
            !
             !
           !
            !
          !
          !
             !
           !
            !
            !
          !
            !
          !
          !
     
  • CyclicBarrierとCountDownLatchの比較
  • CountDownLatch:1つのスレッド(または複数)で、他のNつのスレッドが何かを完了してから実行されます.CyclicBarrier:N個のスレッドは互いに待機し、いずれのスレッドも完了する前にすべてのスレッドが待機しなければならない.
  • CountDownLatch:使い捨て;CyclicBarrier:繰り返し使用できます.
  • CountDownLatchはAQSに基づく.CyclicBarrierはロックとConditionに基づいています.本質的にはvolatileとCASに依存して実現される.