1700451668
编写高质量代码:改善Java程序的151个建议 建议130:使用CountDownLatch协调子线程
1700451669
1700451670
思考这样一个案例:百米赛跑,多个参加赛跑的人员在听到发令枪响后,开始跑步,到达终点后结束计时,然后统计平均成绩。这里有两点需要考虑:一是发令枪响,这是所有跑步者(线程)接收到的出发信号,此处涉及裁判(主线程)如何通知跑步者(子线程)的问题;二是如何获知所有的跑步者完成了赛跑,也就是主线程如何知道子线程已经全部完成,这有很多种实现方式,此处我们使用CountDownLatch工具类来实现,代码如下:
1700451671
1700451672
static class Runner implements Callable<Integer>{
1700451673
1700451674
//开始信号
1700451675
1700451676
private CountDownLatch begin;
1700451677
1700451678
//结束信号
1700451679
1700451680
private CountDownLatch end;
1700451681
1700451682
public Runner(CountDownLatch_begin, CountDownLatch_end){
1700451683
1700451684
begin=_begin;
1700451685
1700451686
end=_end;
1700451687
1700451688
}
1700451689
1700451690
@Override
1700451691
1700451692
public Integer call()throws Exception{
1700451693
1700451694
//跑步的成绩
1700451695
1700451696
int score=new Random().nextInt(25);
1700451697
1700451698
//等待发令枪响起
1700451699
1700451700
begin.await();
1700451701
1700451702
//跑步中……
1700451703
1700451704
TimeUnit.MILLISECONDS.sleep(score);
1700451705
1700451706
//跑步者已经跑完全程
1700451707
1700451708
end.countDown();
1700451709
1700451710
return score;
1700451711
1700451712
}
1700451713
1700451714
}
1700451715
1700451716
public static void main(String[]args)throws Exception{
[
上一页 ]
[ :1.700451667e+09 ]
[
下一页 ]