Sunday, June 18, 2017


CountDownLatch works in latch principle, main thread will wait until gate is open. One thread waits for n number of threads specified while creating CountDownLatch in Java.

Any thread, usually main thread of application, which calls CountDownLatch.await( ) will wait until count reaches zero or its interrupted by another thread. All other thread are required to do count down by calling CountDownLatch.countDown( ) once they are completed or ready.

As soon as count reaches zero, Thread awaiting starts running. One of the disadvantages/advantages of CountDownLatch is that its not reusable once count reaches to zero you can not use CountDownLatch any more.

public class Audioconference implements Runnable{
 // This class uses a CountDownLatch to control the arrivel of all the participants
 private final CountDownLatch controller;
 // Constructor of the class. Initializes the CountDownLatch @param number The number of participants in the Audioconference
 public Audioconference(int number) {
  controller=new CountDownLatch(number);

 // This method is called by every participant when he incorporates to the Audioconference * @param participant
 public void arrive(String name){
  System.out.printf("%s has arrived.\n",name);
  // This method uses the countDown method to decrement the internal counter of the
  // CountDownLatch
  System.out.printf("Audioconference: Waiting for %d participants.\n",controller.getCount());
 // This is the main method of the Controller of the Audioconference. It waits for all the participants and the, starts the conference
 public void run() {
  System.out.printf("Audioconference: Initialization: %d participants.\n",controller.getCount());
  try {
   // Wait for all the participants
   // Starts the conference
   System.out.printf("Audioconference: All the participants have come\n");
   System.out.printf("Audioconference: Let's start...\n");
  } catch (InterruptedException e) {

And Dialer

public class Dialer implements Runnable {

 // Audioconference in which this Dialer will take part off
 private Audioconference conference;
 // Name of the Dialer. For log purposes only
 private String name;
  * Constructor of the class. Initialize its attributes
  * @param conference Audioconference in which is going to take part off
  * @param name Name of the Dialer
 public Dialer(Audioconference conference, String name) {

 // Core method of the Dialer. Waits a random time and joins the Audioconference 
 public void run() {
  Long duration=(long)(Math.random()*10);
  try {
  } catch (InterruptedException e) {


 public static void main(String[] args) {

  // Creates a Audioconference with 10 Dialers.
  Audioconference conference=new Audioconference(10);
  // Creates a thread to run the Audioconference and start it.
  Thread threadConference=new Thread(conference);
  // Creates ten Dialers, a thread for each one and starts them
  for (int i=0; i<10; i++){
   Dialer p=new Dialer(conference, "Dialer "+i);
   Thread t=new Thread(p);


No comments: