您的位置:首页 > 编程语言 > Java开发

java并发之同步屏障CyclicBarrier

2017-10-14 17:01 375 查看
CyclicBarrier 是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

实例:组织一个老板参加的会议,人到齐之前,先到的在会议室等一下。人都来齐了,老板先发言,然后会议正式开始讨论议题,谁积极谁先发言。

public class Participant implements Runnable {
private CyclicBarrier cyclicBarrier;
private String name;
private Long cost;

public Participant(String name,CyclicBarrier cyclicBarrier,Long cost) {
this.cyclicBarrier=cyclicBarrier;
this.name = name;
this.cost=cost;
}

@Override
public void run() {
try {
Thread.sleep(cost);
cyclicBarrier.await();
System.out.println(name);
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
Runnable boss=new Runnable(){
@Override
public void run() {
System.out.println("老板先讲两句。");
}
};
CyclicBarrier c = new CyclicBarrier(3,boss);
Thread t1=new Thread(new Participant("第1个与会者发言,我不一定第一个说",c,5000L));
t1.start();
Thread t2=new Thread(new Participant("第2个与会者发言",c,8000L));
t2.start();
System.out.println("人到齐了,准备开始。");
c.await
4000
();
System.out.println("第3个与会者发言");
}
}


CyclicBarrier和CountDownLatch的区别

CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。

CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。比如以下代码执行完之后会返回true。

参考原文:

http://ifeve.com/concurrency-cyclicbarrier/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: