并发(多线程)------CyclicBarrier解读与例程

前言:CyclicBarrier  ,字面上Cyclic+Barrier --->循环屏障/障碍

这个类所表达的思想和CountDownLauch不一样,CountDownLatch类(见我上篇博客)是一次性的,也就是说如果不更新count,CountDownLatch在保持一次同步后就不会更新同步了  而CyclicBarrier是可以循环利用一开始设置的count同步的,这就是Cyclic的由来,线程到达指定的节点后,等待都到全了才会进行下一轮,这个节点就是屏障,障碍。

可以从游戏的角度来理解这个节点为什么叫障碍,一个游戏地图的游戏,需要4个角色都达指定的位置他们才会进入下一个地图,那么这时候,地图上的这个传送节点就可以看成是一个屏障,我们需要等待角色都到达后才能继续前进。

 

接下来,讲解和案例如下:

源码注释如下

* A synchronization aid that allows a set of threads to all wait for
* each other to reach a common barrier point.  CyclicBarriers are
* useful in programs involving a fixed sized party of threads that
* must occasionally wait for each other. The barrier is called
* <em>cyclic</em> because it can be re-used after the waiting threads
* are released.
*
* <p>A {@code CyclicBarrier} supports an optional {@link Runnable} command
* that is run once per barrier point, after the last thread in the party
* arrives, but before any threads are released.
* This <em>barrier action</em> is useful
* for updating shared-state before any of the parties continue.

从上面可以归纳出几点:

1.CyclicBarriers 可以保持线程之间的同步

2.设置count的值,也就是需要等待同步线程的个数   它可以循环利用,不是一次性的

3.CyclicBarriers 可以有一个Runnable的接口来表示它的动作,这个动作就是把count个线程等待完了,然后执行我们的这个动作,然后再进行下一轮的执行,在源码中   这个动作是  barrierAction

 

 

案例如下:

我们有B、C、D、E四个角色,他们必须一次到达1、2、3、4、5.。。。。。。49个节点后才能领取奖励,意味着游戏结束

public class MyTest {
    static int num = 4;//线程的个数//游戏校色的个数
    static int nn = 0;//节点的个数
    static boolean flag= true;
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {
            @Override
            public void run() {
                nn++;
                if(nn==50){
                    flag = false;
                    System.out.println("游戏结束");
                }
                if (nn<50)
                System.out.println("都到齐了,开始"+"去往第"+nn+"个节点");
            }
        });
        char c = 'A';
        System.out.println("都到齐了,开始"+"去往第"+nn+"个节点");
        for(int i = 0;i<num;i++){
            c = (char)++c;
            new Thread(new Work(barrier), String.valueOf(c)).start();
        }

    }
    static class Work implements Runnable{
        final CyclicBarrier barrier;
        public Work(CyclicBarrier barrier) {
            this.barrier = barrier;
        }
        @Override
        public void run() {
            while(flag){
                System.out.println(Thread.currentThread().getName()+"角色达到了"+"第"+nn+"个节点");
//                System.out.println("barrierIsBroken"+barrier.isBroken());
                try {
                   // System.out.println(Thread.currentThread().getName()+"等待别人过来");
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

执行结果如下:(结果太长,之粘贴了部分)

D角色达到了第30个节点
E角色达到了第30个节点
都到齐了,开始去往第31个节点
E角色达到了第31个节点
C角色达到了第31个节点
D角色达到了第31个节点
B角色达到了第31个节点
都到齐了,开始去往第32个节点
B角色达到了第32个节点
D角色达到了第32个节点
C角色达到了第32个节点
E角色达到了第32个节点
都到齐了,开始去往第33个节点
E角色达到了第33个节点
B角色达到了第33个节点
C角色达到了第33个节点
D角色达到了第33个节点
都到齐了,开始去往第34个节点
D角色达到了第34个节点
E角色达到了第34个节点
C角色达到了第34个节点
B角色达到了第34个节点
都到齐了,开始去往第35个节点
B角色达到了第35个节点
D角色达到了第35个节点
C角色达到了第35个节点
E角色达到了第35个节点
都到齐了,开始去往第36个节点
E角色达到了第36个节点
D角色达到了第36个节点
B角色达到了第36个节点
C角色达到了第36个节点
都到齐了,开始去往第37个节点
C角色达到了第37个节点
B角色达到了第37个节点
E角色达到了第37个节点
D角色达到了第37个节点
都到齐了,开始去往第38个节点
D角色达到了第38个节点
E角色达到了第38个节点
B角色达到了第38个节点
C角色达到了第38个节点
都到齐了,开始去往第39个节点
C角色达到了第39个节点
B角色达到了第39个节点
E角色达到了第39个节点
D角色达到了第39个节点
都到齐了,开始去往第40个节点
D角色达到了第40个节点
E角色达到了第40个节点
B角色达到了第40个节点
C角色达到了第40个节点
都到齐了,开始去往第41个节点
C角色达到了第41个节点
B角色达到了第41个节点
E角色达到了第41个节点
D角色达到了第41个节点
都到齐了,开始去往第42个节点
D角色达到了第42个节点
E角色达到了第42个节点
B角色达到了第42个节点
C角色达到了第42个节点
都到齐了,开始去往第43个节点
C角色达到了第43个节点
B角色达到了第43个节点
E角色达到了第43个节点
D角色达到了第43个节点
都到齐了,开始去往第44个节点
D角色达到了第44个节点
C角色达到了第44个节点
E角色达到了第44个节点
B角色达到了第44个节点
都到齐了,开始去往第45个节点
B角色达到了第45个节点
D角色达到了第45个节点
E角色达到了第45个节点
C角色达到了第45个节点
都到齐了,开始去往第46个节点
C角色达到了第46个节点
D角色达到了第46个节点
B角色达到了第46个节点
E角色达到了第46个节点
都到齐了,开始去往第47个节点
C角色达到了第47个节点
E角色达到了第47个节点
B角色达到了第47个节点
D角色达到了第47个节点
都到齐了,开始去往第48个节点
D角色达到了第48个节点
E角色达到了第48个节点
B角色达到了第48个节点
C角色达到了第48个节点
都到齐了,开始去往第49个节点
C角色达到了第49个节点
B角色达到了第49个节点
E角色达到了第49个节点
D角色达到了第49个节点
游戏结束

Process finished with exit code 0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值