CountDownLatchTest.java
/*
* Copyright@ 2011 www.egtry.com
*/
package egtry.thread;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//1. initialize N. 2. countdown one by one. 3. when counter becomes 0, await return.
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
int n=10;
final CountDownLatch latch=new CountDownLatch(n);
Worker[] list=new Worker[n];
for(int i=0; i<n; i++) {
Worker worker=new Worker(latch);
list[i]=worker;
worker.start();
Worker.sleepRandom(1);
}
latch.await(); //return when there is countdown called n times
int sum=0;
for(int i=0; i<n; i++) {
sum +=list[i].result;
}
System.out.println("All threads are done. The sum is: "+sum);
}
public static class Worker extends Thread {
private CountDownLatch latch;
public int result;
public Worker(CountDownLatch latch) {
this.latch=latch;
}
@Override
public void run() {
long id=Thread.currentThread().getId();
System.out.println("Start Worker: "+id+" at: "+new Date());
sleepRandom(1);
/*
if (Math.random()>0.5) {
throw new RuntimeException("run time error");
}
*/
result=1;
latch.countDown();
System.out.println("End Workder: "+id+" at: "+new Date()+"\n");
}
public static void sleepRandom(int n) {
try {
Thread.sleep((int) (n*Math.random()*1000));
} catch (InterruptedException e) {
}
}
}
}
Output
Start Worker: 8 at: Sun Oct 02 23:38:00 CDT 2011
End Workder: 8 at: Sun Oct 02 23:38:00 CDT 2011
Start Worker: 9 at: Sun Oct 02 23:38:01 CDT 2011
Start Worker: 10 at: Sun Oct 02 23:38:02 CDT 2011
End Workder: 9 at: Sun Oct 02 23:38:02 CDT 2011
End Workder: 10 at: Sun Oct 02 23:38:02 CDT 2011
Start Worker: 11 at: Sun Oct 02 23:38:02 CDT 2011
Start Worker: 12 at: Sun Oct 02 23:38:03 CDT 2011
End Workder: 12 at: Sun Oct 02 23:38:03 CDT 2011
Start Worker: 13 at: Sun Oct 02 23:38:03 CDT 2011
End Workder: 11 at: Sun Oct 02 23:38:03 CDT 2011
End Workder: 13 at: Sun Oct 02 23:38:03 CDT 2011
Start Worker: 14 at: Sun Oct 02 23:38:03 CDT 2011
End Workder: 14 at: Sun Oct 02 23:38:03 CDT 2011
Start Worker: 15 at: Sun Oct 02 23:38:04 CDT 2011
Start Worker: 16 at: Sun Oct 02 23:38:05 CDT 2011
End Workder: 15 at: Sun Oct 02 23:38:05 CDT 2011
End Workder: 16 at: Sun Oct 02 23:38:05 CDT 2011
Start Worker: 17 at: Sun Oct 02 23:38:05 CDT 2011
End Workder: 17 at: Sun Oct 02 23:38:06 CDT 2011
All threads are done. The sum is: 10