应用场景:
应用于主线程等待所有子线程结束后再继续执行的情况。
案例:
比如赛跑,每个运动员看做一个子线程,裁判就是主线程,裁判发令(设置一个值为1的计数器,发令之前所有子线程await等待命令,裁判员发令让计数置为0,所有子线程同时开跑)所有运动员开跑后,需要等待所有人跑完再统计成绩(设置一个值为运动员数目的计数器,所有运动员开跑后裁判await被阻塞,每个运动员跑完的时候countDown()一下,所有运动员跑完计数达到0,裁判释放阻塞开始计分)。
代码:
public class CountDownTest {
private class Runner implements Runnable{
private CountDownLatch countDownLatch;
private int index;//runner的序号
private int[]scores;
public Runner(CountDownLatch countDownLatch,int index,int[]scores) {
this.countDownLatch=countDownLatch;
this.index=index;
this.scores=scores;
}
@Override
public void run() {
Random rand=new Random();
int score=rand.nextInt(1000);
scores[index]=score;
countDownLatch.countDown();//任务执行完成时,调用countDown方法,计数减一
}
}
public static void main(String[] args) {
CountDownLatch latch=new CountDownLatch(10);
ExecutorService exec=Executors.newCachedThreadPool();
int []scores=new int[10];
for(int i=0;i<10;i++){
exec.execute(new CountDownTest().new Runner(latch, i, scores));
}
try {
latch.await();//阻塞主线程,等待所有子线程执行完毕,继续执行下面代码,【阻塞到计数减为0为止】
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
exec.shutdown();
for(int k=0;k<10;k++){
System.out.println("选手号:"+k+"--成绩:"+scores[k]);
}
}
}