1700451739
1700451740
for(int i=0;i<num;i++){
1700451741
1700451742
futures.add(es.submit(new Runner(begin, end)));
1700451743
1700451744
}
1700451745
1700451746
//发令枪响,跑步者开始跑步
1700451747
1700451748
begin.countDown();
1700451749
1700451750
//等待所有跑步者跑完全程
1700451751
1700451752
end.await();
1700451753
1700451754
int count=0;
1700451755
1700451756
//统计总分
1700451757
1700451758
for(Future<Integer>f:futures){
1700451759
1700451760
count+=f.get();
1700451761
1700451762
}
1700451763
1700451764
System.out.println(“平均分数为:”+count/num);
1700451765
1700451766
}
1700451767
1700451768
CountDownLatch类是一个倒数的同步计数器,在程序中启动了两个计数器:一个是开始计数器begin,表示的是发令枪;另外是结束计数器,一共有10个,表示的是每个线程的执行情况,也就是跑步者是否跑完比赛。程序执行逻辑如下:
1700451769
1700451770
1)10个线程都开始运行,执行到begin.await后线程阻塞,等待begin的计数变为0。
1700451771
1700451772
2)主线程调用begin的countDown方法,使begin的计数器为0。
1700451773
1700451774
3)10个线程继续运行。
1700451775
1700451776
4)主线程继续运行下一个语句,end的计数器不为0,主线程等待。
1700451777
1700451778
5)每个线程运行结束时把end的计数器减1,标志着本线程运行完毕。
1700451779
1700451780
6)10个线程全部结束,end计数器为0。
1700451781
1700451782
7)主线程继续执行,打印出成绩平均值。
1700451783
1700451784
CountDownLatch的作用是控制一个计数器,每个线程在运行完毕后会执行countDown,表示自己运行结束,这对于多个子任务的计算特别有效,比如一个异步任务需要拆分成10个子任务执行,主任务必须要知道子任务是否完成,所有子任务完成后才能进行合并计算,从而保证了一个主任务的逻辑正确性。这和我们的实际工作非常类似,比如领导安排了一个大任务给我,我一个人不可能完成,于是我把该任务分解给10个人做,在10个人全部完成后,我把这10个结果组合起来返回给领导—这就是CountDownLatch的作用。
1700451785
1700451786
1700451787
1700451788
[
上一页 ]
[ :1.700451739e+09 ]
[
下一页 ]