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

java并发API:CyclicBarrier跑步比赛--一起跑

2016-01-02 19:06 543 查看
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
(common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环
的 barrier。

CyclicBarrier 支持一个可选的
Runnable
命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

public class CyclicBarrierTest {
private final int RUNNER_COUNT = 10;
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("人到齐了,开跑....");
}
};
final CyclicBarrier barrier = new CyclicBarrier(RUNNER_COUNT, runnable);
public void goHome() throws InterruptedException, BrokenBarrierException {
System.out.println(Thread.currentThread().getName() + "预备....");
barrier.await();
System.out.println(Thread.currentThread().getName() + "跑到终点....");
}
public static void main(String[] args) throws InterruptedException,
BrokenBarrierException {
final CyclicBarrierTest instance = new CyclicBarrierTest();
/**
* 每个线程代表一个Runner
*/
for (int i = 0; i < instance.RUNNER_COUNT; i++) {
new Thread("Runner" + i + "  ") {
public void run() {
try {
instance.goHome();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
};
}.start();
}
}
}
结果:

Runner0  预备....
Runner3  预备....
Runner2  预备....
Runner1  预备....
Runner5  预备....
Runner4  预备....
Runner6  预备....
Runner8  预备....
Runner7  预备....
Runner9  预备....
人到齐了,开跑....
Runner9  跑到终点....
Runner0  跑到终点....
Runner1  跑到终点....
Runner7  跑到终点....
Runner8  跑到终点....
Runner6  跑到终点....
Runner4  跑到终点....
Runner5  跑到终点....
Runner2  跑到终点....
Runner3  跑到终点....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: