CountDownLatch和CyclicBarrier的区别

CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。   
CyclicBarrier  : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。

CyclicBarrier 在释放等待线程后可以重用,所以称它为循环的 barrier。它 还支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。



public class Test {
    public static void main(String[] args) {
        new Test().test1();
    }
    
    public void test1() {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有玩家进入第二关!");
            }
        });

        for (int i = 0; i < 4; i++) {
            new Thread(new Player(i, cyclicBarrier)).start();
        }
    }

    class Player implements Runnable {
        private CyclicBarrier cyclicBarrier;
        private int id;

        public Player(int id, CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
            this.id = id;
        }

        @Override
        public void run() {
            try {
                System.out.println("玩家" + id + "正在玩第一关...");
                cyclicBarrier.await();
                System.out.println("玩家" + id + "进入第二关...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

你可能感兴趣的:(CountDownLatch和CyclicBarrier的区别)