CyclicBarrier介绍 CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 栅栏r。
【java|Java多线程确保子线程执行完再执行-循环栅栏CyclicBarrier】CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),有最后一个线程执行。
对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则用 InterruptedException)以反常的方式离开。
例子 通过上面的介绍,可以通过生活中的列子加深对于此方法的使用场景:
礼拜天了,公司小王约了公司4个美女去郊游,总共5人,由小王开车,约好了上午7点在指定地点集合
约好了时间地点,如果人不全肯定需要等待,不能把没到的扔下离开,下面我们用程序来实现这个例子。
代码示例
public class Test {
public static void main(String[] args) {
String[] person = new String[] {"小王","1号","2号","3号","4号"};
final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("人都到齐了,出发去郊游……");
}
});
for(int i=0;
i<5;
i++) {
new Outing(person[i],barrier).start();
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}class Outing extends Thread {
String name;
CyclicBarrier barrier;
public Outing(String name,CyclicBarrier barrier) {
this.name = name;
this.barrier = barrier;
}
public void run() {
System.out.println(name+"到了");
try {
barrier.await();
//线程到了屏障了,例子中就是人上车了,如果还有没到的就要等待
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)