【Java多线程与并发库】14.java5的CountDownLatch同步工具

来源:互联网 发布:如何评价蛤 知乎 编辑:程序博客网 时间:2024/06/05 07:53
CountDownLatch
犹如倒计时计数器,调用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
1 0