CyclicBarrier

2018-05-17  本文已影响0人  躬行者_白

        CyclicBarrier是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。该栅栏还可以复用。

构造函数:

    public CyclicBarrier(int parties) {

        this(parties,null);

    }

    public CyclicBarrier(int parties, Runnable barrierAction) {

        if (parties <=0)throw new IllegalArgumentException();

        this.parties = parties;

        this.count = parties;

        this.barrierCommand = barrierAction;

    }

    parties:指定相互等待的线程的数量

    barrierAction:当所有线程到达栅栏后优先执行的函数。是新启的一个线程

if (index ==0) {// tripped

    boolean ranAction =false;

try {

        final Runnable command =barrierCommand;

        if (command !=null)

                command.run();//是新启的一个线程  ,执行任务

        ranAction =true;

        nextGeneration();

        return 0;

}finally {

if (!ranAction)

breakBarrier();

}

}

await():栅栏,等待

await(long timeout, TimeUnit unit)

    1、保证线程安全(保证线程)。

    2、获取到锁的线程,count-1,并且进入等待(condition.await() or condition.await(timeout))。

    3、当count等于0的时候,会唤醒所有等待的线程。其中 nextGeneration方法可以实现屏障的循环使用:重新生成Generation对象,恢复count值

    4、等待时间的参数用作condition 的await参数。

上一篇下一篇

猜你喜欢

热点阅读