CountDownLatch用来同步一个或多个 任务,强制他们等待由其他任务执行的一组操作完成。

用法:

给CountDownLatch对象设置一个初值,任何在这个对象上调用await()的方法都将阻塞,等待这个计数值为0,

可以由其他线程在这个对象调用countDown()来减少这个计数值,计数值不能被重置。

countDown()不会造成阻塞。

示例:

/**
* 完成初始化工作的对象
*/
class TaskPortion implements Runnable{
private static int counter=0;
private final int id=counter++;
private static Random rand=new Random(47);
private final CountDownLatch latch;
TaskPortion(CountDownLatch latch){
this.latch=latch;
}
@Override
public void run() {
try {
doWork();
latch.countDown();//减少计数值
} catch (InterruptedException e) {

}
}
public void doWork() throws InterruptedException{
TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));//随机等待一段时间,模拟任务进行
System.out.println(this+"completed");
}
public String toString(){
return String.format("%1$-3d ",id);
}
}

/**
* 等待任务,必须等所有初始化任务完成之后才可以进行
*/
class WaitingTask implements Runnable{
private static int counter=0;
private final int id=counter++;
private final CountDownLatch latch;
WaitingTask(CountDownLatch latch){
this.latch=latch;
}

@Override
public void run() {
try {
latch.await();//使当前任务等待,直到计数值为0
System.out.println("Latch barrier passed for "+this);
} catch (InterruptedException e) {
System.out.println(this+" interrupted");
}
}
public String toString(){
return String.format("WaitingTask %1$-3d",id);
}
}
public class CountDownLatchDemo {
static final int SIZE=100;
public static void main(String[] args) throws Exception{
ExecutorService exec= Executors.newCachedThreadPool();
CountDownLatch latch=new CountDownLatch(SIZE);//初始化计数值为100
for(int i=0;i<10;i++)
exec.execute(new WaitingTask(latch));//10个等待任务
for(int i=0;i<SIZE;i++)
exec.execute(new TaskPortion(latch));//100个初始化任务
System.out.println("Launched all tasks");
exec.shutdown();
}
}

Launched all tasks


43  completed


98  completed


37  completed


96  completed


94  completed


11  completed


21  completed


77  completed


6   completed


9   completed


75  completed


79  completed


10  completed


40  completed


95  completed


64  completed


23  completed


34  completed


29  completed


38  completed


55  completed


90  completed


88  completed


28  completed


4   completed


50  completed


8   completed


12  completed


0   completed


27  completed


99  completed


13  completed


72  completed


71  completed


45  completed


2   completed


91  completed


31  completed


14  completed


17  completed


7   completed


97  completed


35  completed


69  completed


20  completed


32  completed


5   completed


68  completed


36  completed


47  completed


87  completed


70  completed


84  completed


86  completed


66  completed


54  completed


42  completed


41  completed


46  completed


74  completed


57  completed


65  completed


80  completed


1   completed


19  completed


59  completed


15  completed


89  completed


51  completed


25  completed


53  completed


62  completed


58  completed


92  completed


76  completed


22  completed


56  completed


18  completed


85  completed


61  completed


30  completed


60  completed


67  completed


24  completed


26  completed


48  completed


39  completed


33  completed


52  completed


3   completed


93  completed


81  completed


78  completed


73  completed


44  completed


83  completed


49  completed


63  completed


82  completed


16  completed


Latch barrier passed for WaitingTask 0  


Latch barrier passed for WaitingTask 6  


Latch barrier passed for WaitingTask 5  


Latch barrier passed for WaitingTask 4  


Latch barrier passed for WaitingTask 1  


Latch barrier passed for WaitingTask 3  


Latch barrier passed for WaitingTask 2  


Latch barrier passed for WaitingTask 7  


Latch barrier passed for WaitingTask 8  


Latch barrier passed for WaitingTask 9