java并发包之CyclicBarrier

213 阅读1分钟
  • 概念: CyclicBarrier循环屏障,它的作用就是会让所有线程都等待完成后才会继续下一步行动。

  • 例子:大伙聚餐,要等所有朋友都到了才开始吃饭

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
    public static void main(String[] args) {
        CyclicBarrier cb = new CyclicBarrier(10);
        for (int i = 0; i < 10; i++) {
            new Thread(new User(cb, "朋友" + i)).start();
        }
    }
}

class User implements Runnable {
    private String name;
    private CyclicBarrier cb;

    public User(CyclicBarrier cb, String name) {
        this.cb = cb;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            Thread.sleep((long) (Math.random() * 2000));
            System.out.println(name + " 到了");
            cb.await();
            System.out.println(name + ":到齐了,开始吃饭吧");
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}
  • 执行结果:

朋友2:到了
朋友5:到了
朋友3:到了
朋友8:到了
朋友4:到了
朋友7:到了
朋友9:到了
朋友6:到了
朋友1:到了
朋友0:到了
朋友0:到齐了,开始吃饭吧
朋友2:到齐了,开始吃饭吧
朋友5:到齐了,开始吃饭吧
朋友3:到齐了,开始吃饭吧
朋友4:到齐了,开始吃饭吧
朋友9:到齐了,开始吃饭吧
朋友6:到齐了,开始吃饭吧
朋友8:到齐了,开始吃饭吧
朋友1:到齐了,开始吃饭吧
朋友7:到齐了,开始吃饭吧