Chinaunix首页 | 论坛 | 博客
  • 博客访问: 261253
  • 博文数量: 52
  • 博客积分: 1287
  • 博客等级: 少尉
  • 技术积分: 581
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-01 13:53
文章分类

全部博文(52)

文章存档

2012年(48)

2011年(4)

分类: Java

2012-01-09 22:09:55

关卡(CyclicBarrier)允许一个给定数量的成员多次集中在一个关卡点,然后在统一执行后面的操作,这在并行迭代算法中非常有用,能把一个问题拆分成一系列相互独立的子问题。它与CountDownlatch特别类似,但是CountDownLatch不同的是不能被重新重置再使用。还有就是CountDownLatch适用于线程1N的等待,就是一个线程等待n个线程执行完毕后再执行;而CyclicBarrier使所有线程相互等待。

 

示例:

    /* (non-Javadoc)

     * GameBarrier中所有的Player进入第二关时 才执行Barrier的方法

     * 这里的Barrier方法必须实现Runnable接口

     */

Play类:

run(){

System.out.println("玩家" + id + "正在玩第一关...");

    cyclicBarrier.await();//等待其他玩家进入第二关

    System.out.println("玩家" + id + "进入第二关...");

}

 

GameBarrier类:

main() {

    CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Barrier());

 

    for (int i = 0; i < 4; i++) {

       new Thread(new Player(i, cyclicBarrier)).start();

    }

}

 

Barrier类:

Run(){

System.out.println("所有玩家进入第二关!");

}

 

输出结果:

玩家1正在玩第一关...

玩家2正在玩第一关...

玩家3正在玩第一关...

所有玩家进入第二关!

玩家0进入第二关...

玩家1进入第二关...

玩家2进入第二关...

玩家3进入第二关...

 

注意:当cyclicBarrier实现reset操作时,如果有线程还在等待就会抛出异常。还有线程在关卡处等待的时候会有很多种意外情况,这些都要分别去处理。

阅读(1729) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~