import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; 

public class JI9059177 {

	public static void main(String[] args) {
		CyclicBarrier latch = new CyclicBarrier(5, new Runnable() {	

			@Override 
			public void run() { 
				System.out.println("barrier broken"); 

			} 
		}); 
		ExecutorService executer = Executors.newFixedThreadPool(100); 
		for(int i=0;i<10;i++) 
		{ 
			Runnable worker = new barrier(latch); 
			executer.execute(worker);	
		} 
		executer.shutdown(); 

		while (!executer.isTerminated()) { 
		} 
	} 


}

class barrier implements Runnable{ 

	CyclicBarrier cBar; 
	barrier(CyclicBarrier cycBar) 
	{ 
		this.cBar = cycBar; 
	} 
	@Override 
	public void run() { 
		System.out.println("I am using cyclic start " + Thread.currentThread().getName().toString()); 
		try { 
			cBar.await(); 
			System.out.println("I am using cyclic finish 1st " + Thread.currentThread().getName().toString()); 
			cBar.await(); 
			System.out.println("I am using cyclic finish 2nd " + Thread.currentThread().getName().toString()); 
			cBar.await(); 
			System.out.println("I am using cyclic finish 3rd " + Thread.currentThread().getName().toString()); 
		} catch (InterruptedException e) {	
			e.printStackTrace(); 
		} catch (BrokenBarrierException e) { 
			System.out.println("I am broken exception"); 
			e.printStackTrace(); 
		} 
	} 

} 
