【Java多线程与并发库】14.java5的CountDownLatch同步工具
2016-11-02 09:06
806 查看
CountDownLatch
犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数器到达0时,
则所有等待着或单个等待着开始执行。
可以实现一个人(也可以是多个人)等待其它所有人来通知他,也可以实现一个人通知多个人的
效果,类似裁判一声口令,运动员同时开始奔跑,或者所有运动员都跑到终点后裁判才可以公
布结果,这个功能适合做类似百米赛跑的功能。
实例:
答案计数器,基础计数分别是1和3。countDown()方法使计数器的计数减一,所以一开始如
果主线程不执行countDown()方法的话,所有子线程都在等待,直到主线程执行countDown()
方法,然后主线程就在等待各个子线程的答案,3个子线程,每一个执行完任务之后都会把
cdAnswer的计数减一,直到三个线程都完成任务(都减一)的时候,cdAnswer计数才结束,
这时候主线程才可以继续执行。
结果:
转载请注明出处:http://blog.csdn.net/acmman/article/details/53004472
犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数器到达0时,
则所有等待着或单个等待着开始执行。
可以实现一个人(也可以是多个人)等待其它所有人来通知他,也可以实现一个人通知多个人的
效果,类似裁判一声口令,运动员同时开始奔跑,或者所有运动员都跑到终点后裁判才可以公
布结果,这个功能适合做类似百米赛跑的功能。
实例:
package cn.edu.hpu.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service= Executors.newCachedThreadPool(); final CountDownLatch cdOrder=new CountDownLatch(1); final CountDownLatch cdAnswer=new CountDownLatch(3); for (int i = 0; i < 3; i++) { //创建三个一样的线程任务 Runnable runnable=new Runnable(){ public void run() { try { System.out.println("线程:"+Thread.currentThread().getName()+ "正准备接受命令"); cdOrder.await(); System.out.println("线程:"+Thread.currentThread().getName()+ "已接受命令"); Thread.sleep((long)(Math.random()*10000)); System.out.println("线程:"+Thread.currentThread().getName()+ "回应命令处理结果"); cdAnswer.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }; service.execute(runnable); } try { Thread.sleep((long)(Math.random()*10000)); System.out.println("线程:"+Thread.currentThread().getName()+ "即将发布命令"); cdOrder.countDown(); System.out.println("线程:"+Thread.currentThread().getName()+ "已发送命令,正在等待结果..."); cdAnswer.await(); System.out.println("线程:"+Thread.currentThread().getName()+ "已收到所有响应结果"); } catch (Exception e) { e.printStackTrace(); } service.shutdown(); } }首先利用Executors创建了一个缓存线程池(大小自适应),然后创建一个命令计数器和一个
答案计数器,基础计数分别是1和3。countDown()方法使计数器的计数减一,所以一开始如
果主线程不执行countDown()方法的话,所有子线程都在等待,直到主线程执行countDown()
方法,然后主线程就在等待各个子线程的答案,3个子线程,每一个执行完任务之后都会把
cdAnswer的计数减一,直到三个线程都完成任务(都减一)的时候,cdAnswer计数才结束,
这时候主线程才可以继续执行。
结果:
转载请注明出处:http://blog.csdn.net/acmman/article/details/53004472
相关文章推荐
- Java多线程编程之CountDownLatch同步工具使用实例
- (12)java5的CountDownLatch、Exchanger同步工具
- 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
- 【Java多线程与并发库】12.java5的Semaphere同步工具
- Java多线程之同步工具类(CountDownLatch、CyclicBarrier、Semaphore)
- (14)多线程与并发库之java5同步集合类的应用【包含jdk1.5新特性 ConcurrentHashMap】
- Java5 多线程(六)--CountDownLatch 同步工具类
- [Java并发]使用CountDownLatch和CyclicBarrier等待多线程完成
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
- Java多线程与并发库高级应用之倒计时计数器CountDownLatch
- (14)多线程与并发库之java5同步集合类的应用【包含jdk1.5新特性 ConcurrentHashMap】
- Java多线程之~~~使用CountDownLatch来同步多个线程实现一个任务
- 【Java多线程与并发库】12.java5的Semaphere同步工具
- 一直被忽略的java 多线程并发工具类 CountDownLatch、Semaphore
- Java并发学习之十七——线程同步工具之CountDownLatch
- Java/Android多线程并发、同步,线程之间通信,主、子线程的一些问题(CountDownLatch、CyclicBarrier和Semaphore)
- Java并发之CountDownLatch 多功能同步工具类
- Java并发编程之2——同步工具类的使用(CountDownLatch,CyclicBarrier,BlockungQueue,Semaphore)
- Java多线程并发之CountDownLatch