Java同時プログラミングのフェンス(CyclicBarrier)詳細


  • 柵は閉鎖に似ているが、違いがある.ロックはイベントを待つために用いる、フェンスは他のスレッドを待つために用いる.どういう意味ですか.つまり、ロックされて待機するイベントはcountDownイベントであり、countDownイベントが実行された後に待機していたすべてのスレッドが実行される可能性があります.フェンスにはcountDownイベント制御スレッドの実行のようなものはなく、スレッドのawaitメソッドだけが待機スレッドの実行を制御することができる.
  • CyclicBarrierはn個のスレッドを強調して、みんなは互いに待っていて、一つが完成していない限り、すべての人は待たなければなりません.

  • 場面分析:10人で春の旅行に行き、1つの場所に達してから前進することを規定した.コードは次のとおりです.
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    class CyclicBarrierWorker implements Runnable {
        private int id;
        private CyclicBarrier barrier;
    
        public CyclicBarrierWorker(int id, final CyclicBarrier barrier) {
            this.id = id;
            this.barrier = barrier;
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                System.out.println(id + " th people wait");
                barrier.await(); //             
            } catch (InterruptedException | BrokenBarrierException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public class TestCyclicBarrier {
        public static void main(String[] args) {
            int num = 10;
            CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    System.out.println("go on together!");
                }
            });
            for (int i = 1; i <= num; i++) {
                new Thread(new CyclicBarrierWorker(i, barrier)).start();
            }
        }
    }
    

    しゅつりょく
    1 th people wait
    2 th people wait
    3 th people wait
    4 th people wait
    5 th people wait
    7 th people wait
    8 th people wait
    6 th people wait
    9 th people wait
    10 th people wait
    go on together!