打字猴:1.700451667e+09
1700451667 编写高质量代码:改善Java程序的151个建议 [:1700438205]
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 ]  [ 下一页 ]