Following is a program to use CountDownLatch as a CyclicBarrier: (However, unlike CyclicBarrier, CountDownLatch cannot be restarted!) Just to understand how/if CountDownLatch can be used instead of CyclicBarrier.
public class CountDownLatchTry {
private static CountDownLatch latch = new CountDownLatch(2);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable r1 = new Runnable() {
public void run() {
System.out.println("T1: Before countDown()");
latch.countDown();
System.out.println("T1: After countDown()... sleeping");
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("T1: After await()");
}
};
Runnable r2 = new Runnable() {
public void run() {
System.out.println("T2: Before countDown()");
latch.countDown();
System.out.println("T2: After countDown()... sleeping");
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("T2: After await()");
}
};
Thread t1 = new Thread(r1, "T1");
Thread t2 = new Thread(r2, "T2");
t1.start();
t2.start();
System.out.println("Done!");
}
}
Corresponding CyclicBarrier example:
public class CyclicBarrierTry {
private static CyclicBarrier cb = new CyclicBarrier(2);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable r1 = new Runnable() {
public void run() {
System.out.println("T1: Before await()");
try {
cb.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("T1: After await()");
}
};
Runnable r2 = new Runnable() {
public void run() {
System.out.println("T2: Before await()");
try {
cb.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("T2: After await()");
}
};
Thread t1 = new Thread(r1, "T1");
Thread t2 = new Thread(r2, "T2");
t1.start();
t2.start();
System.out.println("Done!");
}
}