/**
* CyclicBarrier可重复使用的屏障
* 我们定义这个屏障,使得子线程在执行的时候可以在某个时刻在这个屏障上等待其他线程
* 等到等待的线程数到达阈值时才一起继续执行
* 而可重复的概念就是走完了上面的一次等待之后重新一次执行的流程之后
* 线程又可以重新在这个屏障上等待,等待其他线程再次都到达屏障之后再继续
* 使用上,首先也需要是有个共享的CyclicBarrier变量可以供线程共享调用来执行await等待
* 增强的构造函数上还可以定义一个线程来 汇总其他等待线程等待时已经执行完的结果
*/
public class CyclicBarrierTest {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(4,new CollectionThread());
static ConcurrentHashMap<String,Long> resMap=new ConcurrentHashMap<>();
public static class CollectionThread implements Runnable{
@Override
public void run() {
System.out.println("i colleciton the all subThread result");
for(Map.Entry<String,Long> item:resMap.entrySet()){
System.out.println(item.getKey()+":"+item.getValue());
}
}
}
public static class SubThread implements Runnable{
@Override
public void run() {
System.out.println("i am subThread:"+Thread.currentThread().getName()+" i fill the map");
resMap.put(Thread.currentThread().getName(),1L);
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("i am subThread:"+Thread.currentThread().getName()+" i fill the map second");
resMap.put(Thread.currentThread().getName(),2L);
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("main start run");
for(int i=0;i<4;i++){
new Thread(new SubThread()).start();
}
System.out.println("main continue");
}
}
CyclicBarrier基本使用
最新推荐文章于 2024-08-28 14:45:05 发布