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

java线程基础之CyclicBarrier学习

2018-03-07 09:39 148 查看
CyclicBarrier相关API

await()
 
          在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
 
await(long timeout, TimeUnit unit)
 
          在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。
 
getNumberWaiting()
 
          返回当前在屏障处等待的参与者数目。
 
getParties()
 
          返回要求启动此 barrier 的参与者数目。
 
isBroken()
 
          查询此屏障是否处于损坏状态。
 
reset()
 
          将屏障重置为其初始状态。
解释
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 
Runnable
 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。个人白话理解:   cycliBarrier就像我们去5.1去玩摩天轮。摩天轮一次做多少人是一定的 只有在入场的人达到满额时候才开启,在旋转一定时间内所有人统一出去,等待下一波。而cyclibarrier也是一样在执行await()后 cycliBarrier计数开始每次加1 只有在达到初始化时指定的计数之后才能执行其他方法Demopackage test.Threae;

import java.util.concurrent.BrokenBarrierExc
9434
eption;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {

static CyclicBarrier  cyc= new CyclicBarrier(2);

public static void main(String[] args) {
CyclicBarrier cyc = new CyclicBarrier(3,new Runnable() {

@Override
public void run() {
System.out.println("thread end");
}
});
for (int i = 0; i < 3; i++) {
new Thread(new CycRun(i, cyc)).start();
}
}
static class CycRun implements Runnable{
private int id;
private CyclicBarrier cyc;
public CycRun(int i,CyclicBarrier cyc){
this.id=i;
this.cyc=cyc;
}
@Override
public void run() {
System.out.println("this id is"+id);
try {
cyc.await();
System.out.println("thread work end "+id);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}

}

}

}
执行结果:

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