| Refresh | Home EGTry.com

map-reduce tasks using CountDownLatch


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