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使用的更多相关文章

  1. Java多线程之CountDownLatch学习

    给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...

  2. JAVA多线程之CountDownLatch

    前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...

  3. JAVA多线程之CountDownLatch与join的区别

    首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...

  4. Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html  一:CountDownLatch CountDownLatch是一个执行 完成任务 ...

  5. 多线程之CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  6. 多线程之CountDownLatch

    下面请看一个应用场景:有1个driver和5个worker,需要满足以下两点要求: 当driver完成了全部的工作之后才允许worker们开始工作: 当所有的worker都完成了自己的工作之后,dri ...

  7. 多线程之CountDownLatch的用法及原理笔记

    前言-CountDownLatch是什么? CountDownLatch是具有synchronized机制的一个工具,目的是让一个或者多个线程等待,直到其他线程的一系列操作完成. CountDownL ...

  8. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  9. python 线程之 threading(四)

    python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...

随机推荐

  1. dj 模型层orm-1

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  2. jQuery length 和 size()区别

    jQuery length和size()区别总结如下: 1.length是属性,size()是方法. 2.如果你只是想获取元素的个数,两者效果一样既 $("img").length ...

  3. idea配置github

    一.事先准备 1.安装Git Git下载: http://git-scm.com/downloads 最新版本是2.1.2 git登陆地址:https://github.com/ 2.注册GitHub ...

  4. Redis-4.0.11集群配置

    版本:redis-3.0.5 redis-3.2.0  redis-3.2.9  redis-4.0.11 参考:http://redis.io/topics/cluster-tutorial. 集群 ...

  5. 【1】jQuery异步(Ajax)操作之JSONP [转]

     前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...

  6. 2.1.4synchronized方法与锁对象

    为了证明线程锁的是对象 测试 package com.cky.bean; /** * Created by chenkaiyang on 2017/12/4. */ public class MyOb ...

  7. redmine 开机自动运行

    想要redmine在centos上开机自动运行,于是就在 /etc/rc.local里面加上了一行脚本 #!/bin/shecho "start redmine:"/usr/loc ...

  8. centos修改主机名命令

    centos修改主机名命令   需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户.    vi / ...

  9. hdu 4961 数论?

    http://acm.hdu.edu.cn/showproblem.php?pid=4961 给定ai数组; 构造bi, k=max(j | 0<j<i,a j%ai=0), bi=ak; ...

  10. tarjan算法--求解无向图的割点和桥

    1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥 也就是说 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥 2.割点:无向连通图中,如 ...