CountDownLatch使用案例

应用场景:

应用于主线程等待所有子线程结束后再继续执行的情况。

 

案例:

比如赛跑,每个运动员看做一个子线程,裁判就是主线程,裁判发令(设置一个值为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]);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值