Java CyclicBarrier示例
时间:2020-02-23 14:34:59 来源:igfitidea点击:
在本教程中,我们将看到Java中的CyclicBarrier。
CyclicBarrier在Java 5中引入了Java 5,其他并发utils,如CountDownLatch,ConcurrentHashMap和BlockingQueue。
CyclicBarrier是同步的辅助辅助辅助装置,其允许在公共屏障点处彼此等待彼此等待。
它被称为循环,因为一旦释放等待线程就可以重复使用。
例如:让我们说你有3个线程,你想要所有线程(作为派对的条款)来达到一个共同点,然后只有他们应该继续前进。
在这种情况下,我们可以使用带有3个派对的CyclicBarrier,并且一次3个线程达到常见点,我们可以调用将执行运行接口的事件,并且将释放三个线程。
CountDownLatch和CyclicBarrier之间的差异
CyclicBarrier和CoundDownlatch之间的主要区别是CyclicBarrier可以重复使用。
我们不能使用次数使用CountDownLatch。
我们可以阅读CountDownLatch和CyclicBarrier之间的更多差异。
Java CyclicBarrier示例:
第1步:在Package .src.org.igi.onitoad中创建名为"runnableTask.java"的文件
package org.igi.theitroad; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class RunnableTask implements Runnable{ CyclicBarrier cyclicBarrier; long sleepTime; RunnableTask(CyclicBarrier cyclicBarrier,long sleepTime){ this.cyclicBarrier=cyclicBarrier; this.sleepTime=sleepTime; } @Override public void run() { try { Thread.sleep(sleepTime); System.out.println(Thread.currentThread().getName() + " is waiting for "+(cyclicBarrier.getParties()-cyclicBarrier.getNumberWaiting()-1)+ " other threads to reach common barrier point"); /* * when 3 parties will call await() method (i.e. common barrier point) * CyclicBarrrierEvent will be triggered and all waiting threads will be released. */ cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("As "+cyclicBarrier.getParties()+ " threads have reached common barrier point " + Thread.currentThread().getName() + " has been released"); } }
这是一个可追踪任务,它将被每个线程执行。
第2步:在Package .src.org.igi.theitroad中创建名为"cyclicbarrierfinishevent.java"的文件
package org.igi.theitroad; public class CyclicBarrierFinishEvent implements Runnable{ public void run() { System.out.println("As 3 threads have reached common barrier point " + ", CyclicBarrrierFinishEvent has been triggered"); System.out.println("You can update shared variables if any"); } }
当3派对(用CyclicBarrier对象初始化)达到共同障碍点时,将调用CyclicBarrierFinishEvent。
第3步:在包中创建名为"cyclicbarriermain.java"的文件.Onitread.theitroad
package org.igi.theitroad; import java.util.concurrent.CyclicBarrier; /** @author igi Mandliya*/ public class CyclicBarrierMain { public static void main(String[] args) { /* * Create CountDownLatch with 3 parties, when all 3 parties * will reach common barrier point CyclicBarrrierFinishEvent will be * triggered */ CyclicBarrier cyclicBarrier=new CyclicBarrier(3 ,new CyclicBarrierFinishEvent()); RunnableTask runnableTask1=new RunnableTask(cyclicBarrier,1000); RunnableTask runnableTask2=new RunnableTask(cyclicBarrier,2000); RunnableTask runnableTask3=new RunnableTask(cyclicBarrier,3000); //Create and start 3 threads new Thread(runnableTask1,"Thread-1").start(); new Thread(runnableTask2,"Thread-2").start(); new Thread(runnableTask3,"Thread-3").start(); /* * We are reusing cyclic barrier using below threads * */ RunnableTask runnableTask4=new RunnableTask(cyclicBarrier,4000); RunnableTask runnableTask5=new RunnableTask(cyclicBarrier,5000); RunnableTask runnableTask6=new RunnableTask(cyclicBarrier,6000); //Create and start 3 more threads new Thread(runnableTask4,"Thread-4").start(); new Thread(runnableTask5,"Thread-5").start(); new Thread(runnableTask6,"Thread-6").start(); } }
让我们运行该程序,然后我们将得到输出:
Thread-1 is waiting for 2 other threads to reach common barrier point Thread-2 is waiting for 1 other threads to reach common barrier point Thread-3 is waiting for 0 other threads to reach common barrier point As 3 threads have reached common barrier point ,CyclicBarrrierFinishEvent has been triggered You can update shared variables if any As 3 threads have reached common barrier point Thread-3 has been released As 3 threads have reached common barrier point Thread-1 has been released As 3 threads have reached common barrier point Thread-2 has been released Thread-4 is waiting for 2 other threads to reach common barrier point Thread-5 is waiting for 1 other threads to reach common barrier point Thread-6 is waiting for 0 other threads to reach common barrier point As 3 threads have reached common barrier point ,CyclicBarrrierFinishEvent has been triggered You can update shared variables if any As 3 threads have reached common barrier point Thread-6 has been released As 3 threads have reached common barrier point Thread-4 has been released As 3 threads have reached common barrier point Thread-5 has been released