欢迎来到天天文库
浏览记录
ID:41032327
大小:45.00 KB
页数:5页
时间:2019-08-14
《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里的
此文档下载收益归作者所有