多线程之CountDownLatch和CyclicBarriar使用
CountDownLatch和CyclicBarriar是java.util.concurrent包下面提供的多线程同步工具,两者有点相似,相当于计数器,但是用处还是有区别的。
CountDownLatch:用于在完成一组正在其它线程中执行的操作之前,它允许一个或多个线程一直等待,await()表示等待,等到其它线程全部执行结束后(即通过countDown()方法来减数,计数为0,即其它线程执行完毕)然后继续执行,示例代码:
public static void main(String[] args) {
        //该计数器初始值1,用于主线程发送命令
        final CountDownLatch latch1 = new CountDownLatch(1);
        //该计数器初始值为2,用于响应命令接受完成
        final CountDownLatch latch2 = new CountDownLatch(2);
        //创建一个大小为2线程池
        ExecutorService executor = Executors.newCachedThreadPool();
        for (int i = 0; i < 2; i++) {
            executor.submit(new Runnable() {
                public void run() {
                    try {
                        System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令");
                        //等待主线程发送命令
                        latch1.await();
                        System.out.println("线程" + Thread.currentThread().getName() + "已接受命令");
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName() + "回应命令处理结果");
                        //命令接受完毕,返回给主线程,latch2减1。
                        latch2.countDown();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        try {
            Thread.sleep((long) (Math.random() * 10000));
            System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令");
            //发送命令,latch1计数减1
            latch1.countDown();
            System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待响应");
            //命令发送后处于等待状态,其它线程全部响应完成,也就是latch2.countDown(),再继续执行
            latch2.await();
            System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果");
        } catch (Exception e) {
            e.printStackTrace();
        }
        //关闭线程池
        executor.shutdown();
    }
CyclicBarriar:用于多个线程在一个指定的公共屏障点(或者说集合点)相互等待,await()方法代表屏障点,每次调用await(),计数(创建CyclicBarriar对象时传入int类型的参数,表示初始计数)减一,直到减到0后,表示所有线程都抵达,然后开始执行后面的任务,示例代码:
public static void main(String[] args) throws Exception {
        //创建CyclicBarrier对象并设置2个公共屏障点
        final CyclicBarrier barrier = new CyclicBarrier(2);
        //创建大小为2的线程池
        ExecutorService executor = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 2; i++) {
            executor.submit(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep((long)(Math.random()*10000));
                        System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点1,当前已有"
                                + barrier.getNumberWaiting() + "个已经到达,正在等候");
                        //如果没有达到公共屏障点,则该线程处于阻塞状态,如果达到公共屏障点则所有处于等待的线程都继续往下运行
                        barrier.await();
                        System.out.println("线程" + Thread.currentThread().getName() + "通过集合地点1");
                        Thread.sleep((long)(Math.random()*10000));
                        System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点2,当前已有"
                                + barrier.getNumberWaiting() + "个已经到达,正在等候");
                        barrier.await();
                        System.out.println("线程" + Thread.currentThread().getName() + "通过集合地点2");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        //关闭线程池
        executor.shutdown();
    }
注意:观察CyclicBarrier的使用可以发现,它计数减至0后,计数器会被重置,可以再次使用,可能这也是它被定义为Cyclic(周期的、循环的)原因,这个是和CountDownLatch区别的地方。
多线程之CountDownLatch和CyclicBarriar使用的更多相关文章
- Java多线程之CountDownLatch学习
		
给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...
 - JAVA多线程之CountDownLatch
		
前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...
 - JAVA多线程之CountDownLatch与join的区别
		
首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...
 - Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用
		
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html 一:CountDownLatch CountDownLatch是一个执行 完成任务 ...
 - 多线程之CountDownLatch、CyclicBarrier和Semaphore
		
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
 - 多线程之CountDownLatch
		
下面请看一个应用场景:有1个driver和5个worker,需要满足以下两点要求: 当driver完成了全部的工作之后才允许worker们开始工作: 当所有的worker都完成了自己的工作之后,dri ...
 - 多线程之CountDownLatch的用法及原理笔记
		
前言-CountDownLatch是什么? CountDownLatch是具有synchronized机制的一个工具,目的是让一个或者多个线程等待,直到其他线程的一系列操作完成. CountDownL ...
 - iOS多线程之8.NSOPeration的其他用法
		
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
 - python 线程之 threading(四)
		
python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...
 
随机推荐
- excel怎样添加的选项卡中含有下拉列表
			
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon s ...
 - 第07章:MongoDB-CRUD操作--文档--创建
			
①语法 insert() save() --有修改没有新增 insertOne() [3.2版本新增]向指定集合中插入一条文档数据 insertMany() [3.2版本新增]向指定集合中插入多条文 ...
 - ubuntu 出现device not managed,解决方法
			
1. 编辑/etc/NetworkManager/NetworkManager.conf: sudo vi /etc/NetworkManager/NetworkManager.conf将其中的man ...
 - php检测服务器是否可用 不可用发动钉钉消息
			
<?php set_time_limit(0); //ping一个IP地址,能不能通 function ping($ip) { $ip_port = explode(':', $ip); // ...
 - 比较jquery中的after(),append(),appendTo()方法
			
html页面: <p id="myp1">我的兴趣爱好是:</p> <button id="b1">after函数</ ...
 - Codeforces Round#416 Div.2
			
A. Vladik and Courtesy 题面 At regular competition Vladik and Valera won a and b candies respectively. ...
 - PuTTY乱码问题解决办法
			
原文链接:http://www.henshiyong.com/archives/403.html 使用PuTTY 时,遇到了乱码问题,查看了别人介绍的信息,解决掉了. 方法其实很简单,现在分享出来. ...
 - mysql-5.7.19 压缩安装 设置密码
			
初始化完毕后,如果没使用新版本的客户端登入,还会报告类似下面的错误: mysql -uroot -p Enter password: ERROR 1862 (HY000): Your password ...
 - web百度地图跨域问题
			
//根据经纬度获取地理位置信息function latOrLng(sLat, sLng) { var resUrl = 'http://api.map.baidu.com/geocoder/v2/?a ...
 - 20155326 2016-2017-2 《Java程序设计》第7周学习总结
			
20155326 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda (1)如果使用JDK8的话,可以使用Lambda特性去除重复的信息. (2)在 ...