Java 多线程之CyclicBarrier
来源:互联网 发布:医生赚钱软件 编辑:程序博客网 时间:2024/05/16 13:05
参考文章:http://www.jianshu.com/p/0c2af47f98fd
import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** *@className CyclicBarrierTest *@description : * * * CyclicBarrier是同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点。 * * * 重要属性: * 锁对象 lock private final ReentrantLock lock = new ReentrantLock(); trip 意思是 直到出错之前的条件 private final Condition trip = lock.newCondition(); 参与者 private final int parties; barrier将执行的任务或者命令 private final Runnable barrierCommand; generation对象。Generation是其内部类 private Generation generation = new Generation(); private int count; * 构造参数如下: * CyclicBarrier(int parties);//指定了参与者数量的CyclicBarrier * CyclicBarrier(int parties, Runnable barrierAction);//指定了参与者数量,并且当参与者都到达时,执行任务barrierAction * if (parties <= 0) throw new IllegalArgumentException(); this.parties = parties; this.count = parties;//将 参与者 数量赋值给count属性 this.barrierCommand = barrierAction; * * CyclicBarrier里面的内部类,它表示当前的CyclicBarrier是否是被损坏的。默认broken为false是完整的。 * private static class Generation {boolean broken = false;} * * * * 重要方法: * 1.nextGeneration()它里面有三个操作, * trip.signalAll();唤醒所有线程 // set up next generation count = parties; generation = new Generation();重新生成Generation对象 * * 2.breakBarrier() 破坏CyclicBarrier * generation.broken = true; count = parties; trip.signalAll(); * .await(),它的内部是调用dowait(false, 0L);这里表示 不超时限制。 * * 3.dowait(boolean timed, long nanos)这里的参数是:对于是否超时,及超时的限制。 * * dowait的内部实现是: * final ReentrantLock lock = this.lock;//获取到了显示锁。 lock.lock(); try { final Generation g = generation; 获取CyclicBarrier的属性 //如果 CyclicBarrier 已损坏,就抛出异常BrokenBarrierException if (g.broken) throw new BrokenBarrierException(); //如果线程中断,破坏此CyclicBarrier并且抛出InterruptedException if (Thread.interrupted()) { breakBarrier(); throw new InterruptedException(); } // int index = --count; 指定线程数量-- if (index == 0) { // tripped 当index ==0 表示,所有指定的数目都已到达指定的公共屏障点 boolean ranAction = false; try { final Runnable command = barrierCommand;//把 barrierCommand属性赋给command if (command != null) 如果创建对象指定barrierAction,将执行run方法 command.run(); ranAction = true; nextGeneration();//执行完之后调用nextGeneration,更新CyclicBarrier状态,并且唤醒所有线程 return 0; } finally { if (!ranAction) //如果 未成功完成上述try中的操作,ranAction为false则会破坏此CyclicBarrier breakBarrier(); } } // loop until tripped, broken, interrupted, or timed out for (;;) { try { if (!timed) trip.await(); else if (nanos > 0L) nanos = trip.awaitNanos(nanos); } catch (InterruptedException ie) { if (g == generation && ! g.broken) { breakBarrier(); throw ie; } else { // We're about to finish waiting even if we had not // been interrupted, so this interrupt is deemed to // "belong" to subsequent execution. Thread.currentThread().interrupt(); } } if (g.broken) throw new BrokenBarrierException(); if (g != generation) return index; if (timed && nanos <= 0L) { breakBarrier(); throw new TimeoutException(); } } } finally { lock.unlock(); finally释放锁,这点要注意 } * * *@date 2017年6月15日上午9:54:03 * */public class CyclicBarrierTest { private static CyclicBarrier cBarrier = null; public static void main(String[] args) { cBarrier = new CyclicBarrier(5,new Runnable() { @Override public void run() { System.out.println("人到齐了,开会吧"); } }); for(int i=0;i<5;i++){ Thread party = new PartiesThread(); /*if(i == 4){ party.interrupt(); try { Thread.currentThread().sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/ party.start(); } } static class PartiesThread extends Thread{ public void run(){ System.out.println(Thread.currentThread().getName()+"到了会议室"); try { cBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }}
阅读全文
0 0
- Java多线程之CyclicBarrier
- Java多线程之CyclicBarrier
- JAVA多线程之CyclicBarrier
- Java多线程之CyclicBarrier
- Java多线程之CyclicBarrier
- Java多线程之----CyclicBarrier
- Java 多线程之CyclicBarrier
- JAVA多线程之(CyclicBarrier)
- Java多线程技术之CyclicBarrier
- (九)java多线程之CyclicBarrier
- java多线程问题之同步器CyclicBarrier
- Java多线程之CyclicBarrier(一)
- Java多线程同步工具之CyclicBarrier
- 我之见--java 多线程CyclicBarrier
- Java多线程之~~~CyclicBarrier 类的使用
- java多线程之利用“CyclicBarrier”汇总结果
- java多线程之CyclicBarrier类基本用法
- java多线程之CyclicBarrier简单用法
- 刻度标尺精确定位系统-更为人性化的位置检测系统
- C# 读取ini配置 :
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 内部排序算法:直接插入排序
- iOS 算法面试题(冒泡排序、选择排序、链表逆序)~demo
- Java 多线程之CyclicBarrier
- Activity小总结
- Turnserver服务器搭建
- RSA加密算法遇到长中文字符串分解的问题
- 关于虚拟路径和绝对路径(Tomcat)
- Kotlin最简单的入门教程——委托
- 根据分钟数换算成天/小时/分钟
- 微信小程序开发不能直接操作 Page.data
- Android webview 加载不出视频