CyclicBarrier

CyclicBarrier类似于闭锁,它能够阻塞一组线程直到某个事件发生。
它与闭锁主要的区别在于,所有线程必须同时到达一个点,才能继续执行。
闭锁等待的是事件,是等待countDown()执行之后,之前等待的线程才可能继续执行。
栅栏是线程之间相互等待,然后同时到达一个点后在一起执行(可以中断、超时)。

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;
}

public int await() throws InterruptedException, BrokenBarrierException {
        try {
            return dowait(false, 0L);
        } catch (TimeoutException toe) {
            throw new Error(toe); // cannot happen
        }
}

public int await(long timeout, TimeUnit unit)
        throws InterruptedException,
               BrokenBarrierException,
               TimeoutException {
        return dowait(true, unit.toNanos(timeout));
}

样例:赛跑就是一个比较贴切的示例
public static void main (String[] args)
{
ExecutorService pool = Executors.newFixedThreadPool(4);
CyclicBarrier barrier = new CyclicBarrier(4, new Runnable()
{
@Override public void run ()
{
System.out.println("----各就各位----开始!");
}
});
for (int i = 0; i < 4; i++)
{
pool.execute(new Runner(barrier, i + 1));
}
pool.shutdown();
}

static class Runner implements Runnable
{
private CyclicBarrier barrier;
private int count;

public Runner (CyclicBarrier barrier, int count)
{
this.barrier = barrier;
this.count = count;
}

@Override public void run ()
{
try
{
Thread.sleep(new Random().nextInt(5000));
System.out.println(count + "号参赛者已准备!");
barrier.await();
System.out.println(count + "号参赛---GO!");
} catch (InterruptedException e)
{
e.printStackTrace();
} catch (BrokenBarrierException e)
{
e.printStackTrace();
}
}
}

运行结果
1号参赛者已准备!
2号参赛者已准备!
3号参赛者已准备!
4号参赛者已准备!
----各就各位----开始!
4号参赛---GO!
1号参赛---GO!
2号参赛---GO!
3号参赛---GO!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值