CountDownLatch

import java.util.Random;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;



/** 

* @Title: Project.java 

* @Package 

* @Description: 

* @author 任伟 

* @date 2015年1月29日 下午5:36:11 

* @version V1.0 

*/



/**

* @ClassName: Project

* @Description:模拟项目的开发,只有当每个模块都完成后,项目才完成 每个模块的用时不同

* @author 任伟

* @date 2015年1月29日 下午5:36:11

*/

public class Project {

static final int SIZE = 20;



public static void main(String[] args) {

ExecutorService exec = Executors.newCachedThreadPool(); // 线程池(缓存型池子)

CountDownLatch latch = new CountDownLatch(SIZE); // 门闩

Controller controller = new Controller(latch);

exec.execute(controller);

Random r = new Random(); 

for (int i = 0; i < SIZE; i++) {

exec.execute(new Module(latch, "模块" + (i + 1), r.nextInt(2000)));

}

exec.shutdown();

}

}



class Module implements Runnable {

private CountDownLatch latch;

private String moduleName;

private int time;



/**

* @param latch

* @param moduleName

* @param time

*/

public Module(CountDownLatch latch, String moduleName, int time) {

super();

this.latch = latch;

this.moduleName = moduleName;

this.time = time;

}



@Override

public void run() {

try {

work();

latch.countDown();// 调用了 countDown() 方法,在当前计数到达零之前,await 方法会一直受阻塞

} catch (InterruptedException e) {

e.printStackTrace();

}

}



private void work() throws InterruptedException {

TimeUnit.MICROSECONDS.sleep(time);

System.out.println(moduleName + "完成,耗时:" + time);



}



}



class Controller implements Runnable {

private CountDownLatch latch;



public Controller(CountDownLatch latch) {

super();

this.latch = latch;

}



@Override

public void run() {

try {

latch.await();

System.out.println("所有模块都完成,任务完成");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

  当await(),当前线程阻塞,直到CountDownLatch=0被唤醒

       countDown(),CountDownLatch-1

你可能感兴趣的:(CountDownLatch)