CyclicBarrier 使用

CyclicBarrier 同步屏障

和CountDownLatch类似

可循环使用的屏障,一组线程到达屏障时被阻塞,直到最后一个线程到达时,屏障才开门,所有被拦截的线程继续执行。

例如:

渣男贾冰,要和3个女生,按照顺序挨个约会:第一个是娜扎,第二个是热巴,第三个是柳岩

第一个娜扎先和贾冰约会
第二个热巴可以在家多睡3秒钟,等贾冰和娜扎约完了
第三个柳岩可以在家多睡6秒钟,等贾冰和热巴约完了
public class CyclicBarrierTest {

    private static String girl = "【娜扎】";

    public static void main(String[] args) {
        //设置屏障等待数量为2个
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2,
                () -> System.out.println("贾冰的约会对象是:" + girl));

        //贾冰线程
        Thread a1 = new Thread(() -> {
            try {
                //每次约会完休息3秒
                show("等待第1个约会对象");
                cyclicBarrier.await();
                show("第1个约会太累,休息1秒======================");
                Thread.sleep(1000);

                show("等待第2个约会对象");
                girl = "【热巴】";
                cyclicBarrier.await();
                show("第2个约会太累,休息1秒======================");
                Thread.sleep(1000);


                show("等待第3个约会对象");
                girl = "【柳岩】";
                cyclicBarrier.await();
                show("第3个约会太累,暂停营业,回家休息======================");
                Thread.sleep(1000);

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "贾冰");

        //娜扎线程
        Thread a2 = new Thread(() -> {
            try {
                show("贾哥哥久等了");
                cyclicBarrier.await();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "娜扎");

        //热巴线程
        Thread a3 = new Thread(() -> {
            try {
                show("睡个懒觉3秒");
                Thread.sleep(3000);
                show("贾哥哥久等了");
                cyclicBarrier.await();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "热巴");

        //柳岩线程
        Thread a4 = new Thread(() -> {
            try {
                show("睡个懒觉6秒");
                Thread.sleep(6000);
                show("贾哥哥久等了");
                cyclicBarrier.await();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "柳岩");


        a1.start();
        a2.start();
        a3.start();
        a4.start();
    }
   //加线程名称显示信息
    private static void show(String s) {
        System.out.println(Thread.currentThread().getName() + ":" + s);
    }
}

输出结果:

贾冰:等待第1个约会对象
柳岩:睡个懒觉6秒
热巴:睡个懒觉3秒
娜扎:贾哥哥久等了
贾冰的约会对象是:【娜扎】
贾冰:第1个约会太累,休息1秒======================
贾冰:等待第2个约会对象
热巴:贾哥哥久等了
贾冰的约会对象是:【热巴】
贾冰:第2个约会太累,休息1秒======================
贾冰:等待第3个约会对象
柳岩:贾哥哥久等了
贾冰的约会对象是:【柳岩】
贾冰:第3个约会太累,暂停营业,回家休息======================

 

 核心方法:

方法功能
await() 等待计数为0
await(long timeout, TimeUnit unit) 等待计数为0,或者超时

 

 

 

 

posted on 2024-06-06 13:05  欢跳的心  阅读(5)  评论(0编辑  收藏  举报