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

Java并发同步工具类之CyclicBarrier

2016-02-23 20:01 661 查看
CyclicBarrier循环栅栏,允许多个线程相互等待,直到到达一个共同的障碍点。非常适用的场景是一定数量的线程之间需要相互等待彼此。CyclicBarrier因为有Cyclic,所以可以循环使用。

class CyclicBarrierTest {
private static Logger logger = LoggerFactory.getLogger(CyclicBarrierTest.class);
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

System.out.println("cyclicBarrierTest begin...");
new Runner(cyclicBarrier,"zs").start(); // 启动三个子线程         new Runner(cyclicBarrier,"ls").start();
new Runner(cyclicBarrier,"ww").start();

System.out.println("cyclicBarrierTest end ...."); //主线程不会阻塞,所以启动子线程之后,这里会马上执行     }

static class Runner extends Thread{
private CyclicBarrier cyclicBarrier ;
private String name;

public Runner(CyclicBarrier cyclicBarrier,String name){
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}

@Override
public void run(){
try {
Thread.currentThread().sleep(1000);
System.out.println(name+": is ready....");
cyclicBarrier.await(); // 三个子线程会在这里进行第一步的等待 (与主线程无关)当三个子线程都执行完成之后,会同时进行下一步的工作                  Thread.currentThread().sleep(1000);
System.out.println(name+": is running...");
cyclicBarrier.await(); // 三个子线程会在这里进行第二步的等待(与主线程无关)当三个子线程都执行完成之后,会同时进入下一步的操作                  Thread.currentThread().sleep(1000);
System.out.println(name+": is complete..."); //执行完成之后,子线程退出              }catch (Exception e){
logger.error("Runner run method cause exception : ",e);

}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息