【窗外音】线程同步--关卡(CyclicBarrier)

1801阅读 0评论2012-01-09 ranson_zop
分类:Java

关卡(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操作时,如果有线程还在等待就会抛出异常。还有线程在关卡处等待的时候会有很多种意外情况,这些都要分别去处理。

上一篇:数据库
下一篇:在ubuntu下用eclipse-cdt调试memcached