爪哇 循环屏障示例

在本文中,我们将介绍Java中的CyclicBarrier。 循环屏障在Java 5中与其他并发utils一起引入,例如 CountDownLatch, 并发哈希图 和 阻塞队列.
循环屏障是同步的辅助工具,它允许线程集在公共的屏障点处彼此等待。之所以称为循环的,是因为一旦释放等待的线程,它便可以重用。
例如:
让’假设您有3个线程,您希望所有线程(作为参与方的术语)都达到一个共同点,然后只有它们应该继续前进。在这种情况下,您可以将CyclicBarrier与3个参与方一起使用,一旦3个线程达到一个共同点,您就可以可以调用将实现可运行接口的事件,并释放三个线程。
CountDownLatch和CyclicBarrier之间的区别
循环屏障和CoundDownLatch之间的主要区别是CyclicBarrier可以重用。一次使用后不能使用CountDownLatch。您可以阅读更多 CountDownLatch和CyclicBarrier之间的区别。
爪哇 循环屏障示例:
步骤1: 创建一个名为"RunnableTask.java"在软件包.src.org.arpit.java2blog中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
包 组织.Arpit.爪哇2blog; 进口 爪哇.实用程序.同时.BrokenBarrierException; 进口 爪哇.实用程序.同时.循环屏障; 上市 类 可运行Task 实施 可运行{ 循环屏障 循环屏障; 长 睡觉时间; 可运行Task(循环屏障 循环屏障,长 睡觉时间){ 这个.循环屏障=循环屏障; 这个.睡觉时间=睡觉时间; } @覆写 上市 虚空 跑() { 尝试 { 线.睡觉(睡觉时间); 系统.出.打印(线.currentThread().getName() + “正在等待”+(循环屏障.getParties()-循环屏障.getNumberWaiting()-1)+ “其他线程达到共同的障碍点”); / * * when 3个参与者将调用await()方法(即公共障碍点) * CyclicBarrrierEvent将被触发,所有等待线程将被释放。 */ 循环屏障.等待(); } 抓住 (InterruptedException e) { e.printStackTrace(); } 抓住 (BrokenBarrierException e) { e.printStackTrace(); } 系统.出.打印(“作为”+循环屏障.getParties()+ “线程已达到共同的障碍” + 线.currentThread().getName() + “已被释放”); } } |
这是一个Runnable任务,将由每个线程执行。
第2步: 创建一个名为"CyclicBarrierFinishEvent.java"在软件包.src.org.arpit.java2blog中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
包 组织.Arpit.爪哇2blog; 上市 类 循环屏障FinishEvent 实施 可运行{ 上市 虚空 跑() { 系统.出.打印(“由于3个线程已达到共同的障碍点” + “,已触发CyclicBarrrierFinishEvent”); 系统.出.打印(“您可以更新共享变量(如果有)”); } } |
当3个参与方(由CyclicBarrier对象初始化)到达一个公共障碍点时,将调用CyclicBarrierFinishEvent。
第三步: 创建一个名为"CyclicBarrierMain.java"在软件包.src.org.arpit.java2blog中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
包 组织.Arpit.爪哇2blog; 进口 爪哇.实用程序.同时.循环屏障; / ** @作者Arpit Mandliya * / 上市 类 循环屏障Main { 上市 静态的 虚空 主要(串[] args) { / * *当所有3个参与方都创建有3个参与方的CountDownLatch *将达到公共障碍点CyclicBarrrierFinishEvent将为 * triggered */ 循环屏障 循环屏障=新 循环屏障(3 ,新 循环屏障FinishEvent()); 可运行Task 跑nableTask1=新 可运行Task(循环屏障,1000); 可运行Task 跑nableTask2=新 可运行Task(循环屏障,2000); 可运行Task 跑nableTask3=新 可运行Task(循环屏障,3000); //创建并启动3个线程 新 线(跑nableTask1,“线程1”).开始(); 新 线(跑nableTask2,“线程2”).开始(); 新 线(跑nableTask3,“线程3”).开始(); / * *我们正在使用以下线程重用循环屏障 * */ 可运行Task 跑nableTask4=新 可运行Task(循环屏障,4000); 可运行Task 跑nableTask5=新 可运行Task(循环屏障,5000); 可运行Task 跑nableTask6=新 可运行Task(循环屏障,6000); //创建并启动另外3个线程 新 线(跑nableTask4,“线程4”).开始(); 新 线(跑nableTask5,“线程5”).开始(); 新 线(跑nableTask6,“线程6”).开始(); } } |
让’s运行程序,那么我们将了解输出:
线程2正在等待其他1个线程到达公共屏障点
线程3正在等待其他0个线程到达公共屏障点
当3个线程达到公共障碍点时,已触发CyclicBarrrierFinishEvent
您可以更新共享变量(如果有)
随着3个线程达到共同的障碍点,Thread-3已发布
当3个线程达到共同的障碍点时,线程1已发布
当3个线程达到共同的障碍点时,线程2已发布
线程4正在等待其他2个线程到达公共障碍点
线程5正在等待其他1个线程到达公共障碍点
线程6正在等待其他0个线程到达公共屏障点
当3个线程达到公共障碍点时,已触发CyclicBarrrierFinishEvent
您可以更新共享变量(如果有)
当3个线程达到共同的障碍时,线程6已发布
当3个线程达到共同的障碍点时,Thread-4已发布
当3个线程达到共同的障碍点时,Thread-5已发布
下图将使您更好地理解输出。
那’关于Java 循环屏障示例的全部内容。