分类: Java
2012-01-09 22:09:55
关卡(CyclicBarrier)允许一个给定数量的成员多次集中在一个关卡点,然后在统一执行后面的操作,这在并行迭代算法中非常有用,能把一个问题拆分成一系列相互独立的子问题。它与CountDownlatch特别类似,但是CountDownLatch不同的是不能被重新重置再使用。还有就是CountDownLatch适用于线程1:N的等待,就是一个线程等待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操作时,如果有线程还在等待就会抛出异常。还有线程在关卡处等待的时候会有很多种意外情况,这些都要分别去处理。