Understanding Java Circular Barrier

Understanding Java Circular Barrier



A CyclicBarrier is a synchronizer that allows a set of threads to wait for each other to reach a common execution point, also called a barrier.
CyclicBarriers are used in programs in which we have a fixed number of threads that must wait for each other to reach a common point before continuing execution.
Java CyclicBarrier Example

Java CyclicBarrier
The barrier is called cyclic because it can be re-used after the waiting threads are released.
Consider the example of Amusement ride like a Ferris Wheel. The Ferris Wheel ride does not start until all the seats are occupied.

Java CyclicBarrier Tutorial
Suppose a Ferris Wheel has 10 seats. We consider each passenger as a Thread. Unless and until there are 10 passengers the Ferris Wheel will not start. Once there are 10 passengers the ride begins.
Then once again we start the count of passengers for a new ride. We implement this scenario using a Cyclic Barrier. We create a Cyclic Barrier with size 10. So unless and until 10 passengers enter this cyclic barrier will not be broken and the passengers will have to wait. Once done the Ride is started. After the ride by calling the Reset method of the cyclic barrier we again wait for the next 10 passengers to start the ride.
	package com.javastructures;

public class Ride implements Runnable {

	public void run() {
		System.out.println("All Seats are full. The Ride has started.");
	}

}
	
	package com.javastructures;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class FerrisWheel extends Thread{
	CyclicBarrier waitPoint;
	
	public FerrisWheel(CyclicBarrier waitPoint,String name) {
		super(name);
		this.waitPoint = waitPoint;
	}

	
	
	@Override
	public void run()
	{
		System.out.println("Passenger "+ getName()+ "has taken seat");
		try {
			waitPoint.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
	
	
	package com.javastructures;

import java.util.concurrent.CyclicBarrier;

public class CyclicRaceDemo {
	
	public static void main(String args[])
	{
		System.out.println("The Ferris Wheel has 10 seats");
		CyclicBarrier rideBarrier= new CyclicBarrier(10,new Ride()) ;
		new FerrisWheel(rideBarrier,"Passenger1").start();
		new FerrisWheel(rideBarrier,"Passenger2").start();
		new FerrisWheel(rideBarrier,"Passenger3").start();
		new FerrisWheel(rideBarrier,"Passenger4").start();
		new FerrisWheel(rideBarrier,"Passenger5").start();
		new FerrisWheel(rideBarrier,"Passenger6").start();
		new FerrisWheel(rideBarrier,"Passenger7").start();
		new FerrisWheel(rideBarrier,"Passenger8").start();
		new FerrisWheel(rideBarrier,"Passenger9").start();
		new FerrisWheel(rideBarrier,"Passenger10").start();
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("*****************");
		System.out.println("Starting new Ride");
		rideBarrier.reset();
		new FerrisWheel(rideBarrier,"Passenger1").start();
		new FerrisWheel(rideBarrier,"Passenger2").start();
		new FerrisWheel(rideBarrier,"Passenger3").start();
		new FerrisWheel(rideBarrier,"Passenger4").start();
		new FerrisWheel(rideBarrier,"Passenger5").start();
		new FerrisWheel(rideBarrier,"Passenger6").start();
		new FerrisWheel(rideBarrier,"Passenger7").start();
		new FerrisWheel(rideBarrier,"Passenger8").start();
		new FerrisWheel(rideBarrier,"Passenger9").start();
		new FerrisWheel(rideBarrier,"Passenger10").start();
		
		
	}

}
	
Run the program as a Java Application - Java Program for circular barrier