java并发编程中CountDownLatch和CyclicBarrier的使用

java并发编程中CountDownLatch和CyclicBarrier的使用

ID:41032327

大小:45.00 KB

页数:5页

时间:2019-08-14

java并发编程中CountDownLatch和CyclicBarrier的使用_第1页
java并发编程中CountDownLatch和CyclicBarrier的使用_第2页
java并发编程中CountDownLatch和CyclicBarrier的使用_第3页
java并发编程中CountDownLatch和CyclicBarrier的使用_第4页
java并发编程中CountDownLatch和CyclicBarrier的使用_第5页
资源描述:

《java并发编程中CountDownLatch和CyclicBarrier的使用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、java并发编程中CountDownLatch和CyclicBarrier的使用收藏java并发编程中CountDownLatch和CyclicBarrier的使用  在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景,遇到这样的场景应该如何解决?如果是一个线程等待一个线程,则可以通过await()和notify()来实现;如果是一个线程等待多个线程,则就可以使用CountDownLatch和CyclicBarrier来实现比较好的控制。下面来详细描述下CountDownLatch的应用场景:例如:百米赛跑:8名运动员同时起跑,由于速

2、度的快慢,肯定有会出现先到终点和晚到终点的情况,而终点有个统计成绩的仪器,当所有选手到达终点时,它会统计所有人的成绩并进行排序,然后把结果发送到汇报成绩的系统。其实这就是一个CountDownLatch的应用场景:一个线程或多个线程等待其他线程运行达到某一目标后进行自己的下一步工作,而被等待的“其他线程”达到这个目标后继续自己下面的任务。这个场景中:1.被等待的“其他线程”------>8名运动员2.等待“其他线程”的这个线程------>终点统计成绩的仪器那么,如何来通过CountDownLatch来实现上述场景的线程控制和调度呢?jdk中Co

3、untDownLatch类有一个常用的构造方法:CountDownLatch(intcount);                       两个常用的方法:await()和countdown() 其中count是一个计数器中的初始化数字,比如初始化的数字是2,当一个线程里调用了countdown(),则这个计数器就减一,当线程调用了await(),则这个线程就等待这个计数器变为0,当这个计数器变为0时,这个线程继续自己下面的工作。下面是上述CountDownLatch场景的实现:Work类(运动员):importjava.util.concu

4、rrent.CountDownLatch;publicclassWorkimplementsRunnable{ privateintid; privateCountDownLatchbeginSignal; privateCountDownLatchendSignal;  publicWork(intid,CountDownLatchbegin,CountDownLatchend){  this.id=id;  this.beginSignal=begin;  this.endSignal=end; } @Override publicvoidr

5、un(){  try{   beginSignal.await();   System.out.println("起跑...");   System.out.println("work"+id+"到达终点");   endSignal.countDown();   System.out.println("work"+id+"继续干其他事情");  }catch(InterruptedExceptione){   //TODOAuto-generatedcatchblock   e.printStackTrace();  } }}Main类(终点统

6、计仪器):importjava.util.concurrent.CountDownLatch;publicclassMain{  publicstaticvoidmain(String[]args){  CountDownLatchbegSignal=newCountDownLatch(1);  CountDownLatchendSignal=newCountDownLatch(8);    for(inti=0;i<8;i++){   newThread(newWork(i,begSignal,endSignal)).start();  }  

7、  try{   begSignal.countDown(); //统一起跑   endSignal.await();     //等待运动员到达终点   System.out.println("结果发送到汇报成绩的系统");  }catch(InterruptedExceptione){   e.printStackTrace();  } }}下面详细描述下CyclicBarrier的应用场景:有四个游戏玩家玩游戏,游戏有三个关卡,每个关卡必须要所有玩家都到达后才能允许通关。其实这个场景里的玩家中如果有玩家A先到了关卡1,他必须等待其他所有玩家

8、都到达关卡1时才能通过,也就是说线程之间需要互相等待,这和CountDownLatch的应用场景有区别,CountDownLatch里的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。