这两天写多线程时,用到了CyclicBarrier,下意识的认为CyclicBarrier和CountDownLatch作用很像,就翻阅资料查了一下,说一下他们的区别吧

CyclicBarrier和CountDownLatch 都位于java.util.concurrent 这个包下

CountDownLatch CyclicBarrier
减计数方式 加计数方式
计算为0时释放所有等待的线程 计数达到指定值时释放所有等待线程
计数为0时,无法重置 计数达到指定值时,计数置为0重新开始
调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞
不可重复利用 可重复利用

一、CountDownLatch用法

CountDownLatch类只提供了一个构造器:

[java] view plain copy
  1. public CountDownLatch(int count) {  };  //参数count为计数值

然后下面这3个方法是CountDownLatch类中最重要的方法:

[java] view plain copy
  1. public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
  2. public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
  3. public void countDown() { };  //将count值减1

CountDownLatch, 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

下面举个例子说明:

[java] view plain copy
  1. package main.java.CountDownLatch;
  2. import java.util.concurrent.CountDownLatch;
  3. /**
  4. * PROJECT_NAME:downLoad
  5. * Author:lucaifang
  6. * Date:2016/3/18
  7. */
  8. public class countDownlatchTest {
  9. public static void main(String[] args) throws InterruptedException {
  10. CountDownLatch countDownLatch = new CountDownLatch(5);
  11. for(int i=0;i<5;i++){
  12. new Thread(new readNum(i,countDownLatch)).start();
  13. }
  14. countDownLatch.await();
  15. System.out.println("线程执行结束。。。。");
  16. }
  17. static class readNum  implements Runnable{
  18. private int id;
  19. private CountDownLatch latch;
  20. public readNum(int id,CountDownLatch latch){
  21. this.id = id;
  22. this.latch = latch;
  23. }
  24. @Override
  25. public void run() {
  26. synchronized (this){
  27. System.out.println("id:"+id);
  28. latch.countDown();
  29. System.out.println("线程组任务"+id+"结束,其他任务继续");
  30. }
  31. }
  32. }
  33. }

输出结果:

id:1
线程组任务1结束,其他任务继续
id:0
线程组任务0结束,其他任务继续
id:2
线程组任务2结束,其他任务继续
id:3
线程组任务3结束,其他任务继续
id:4
线程组任务4结束,其他任务继续
线程执行结束。。。。

线程在countDown()之后,会继续执行自己的任务,而CyclicBarrier会在所有线程任务结束之后,才会进行后续任务,具体可以看下面例子。

二、CyclicBarrier用法

CyclicBarrier提供2个构造器:

[java] view plain copy
  1. public CyclicBarrier(int parties, Runnable barrierAction) {
  2. }
  3. public CyclicBarrier(int parties) {
  4. }

参数parties指让多少个线程或者任务等待至barrier状态;参数barrierAction为当这些线程都达到barrier状态时会执行的内容。

CyclicBarrier中最重要的方法就是await方法

[java] view plain copy
  1. public int await() throws InterruptedException, BrokenBarrierException { };//挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;
  2. public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };//让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务

举例说明

[java] view plain copy
  1. package main.java.countOff;
  2. import java.util.concurrent.CyclicBarrier;
  3. /**
  4. * PROJECT_NAME:downLoad
  5. * Author:lucaifang
  6. * Date:2016/3/18
  7. */
  8. public class cyclicBarrierTest {
  9. public static void main(String[] args) throws InterruptedException {
  10. CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
  11. @Override
  12. public void run() {
  13. System.out.println("线程组执行结束");
  14. }
  15. });
  16. for (int i = 0; i < 5; i++) {
  17. new Thread(new readNum(i,cyclicBarrier)).start();
  18. }
  19. //CyclicBarrier 可以重复利用,
  20. // 这个是CountDownLatch做不到的
  21. //        for (int i = 11; i < 16; i++) {
  22. //            new Thread(new readNum(i,cyclicBarrier)).start();
  23. //        }
  24. }
  25. static class readNum  implements Runnable{
  26. private int id;
  27. private CyclicBarrier cyc;
  28. public readNum(int id,CyclicBarrier cyc){
  29. this.id = id;
  30. this.cyc = cyc;
  31. }
  32. @Override
  33. public void run() {
  34. synchronized (this){
  35. System.out.println("id:"+id);
  36. try {
  37. cyc.await();
  38. System.out.println("线程组任务" + id + "结束,其他任务继续");
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. }
  45. }

输出结果:

id:1
id:2
id:4
id:0
id:3
线程组执行结束
线程组任务3结束,其他任务继续
线程组任务1结束,其他任务继续
线程组任务4结束,其他任务继续
线程组任务0结束,其他任务继续
线程组任务2结束,其他任务继续

CyclicBarrier和CountDownLatch区别相关推荐

  1. 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch

    转载: CyclicBarrier的用法 CountDownLatch(倒计时计数器)使用说明 参考: CyclicBarrier和CountDownLatch区别 CyclicBarrier Cyc ...

  2. 请简要说明一下CyclicBarrier和CountDownLatch的区别?

    请简要说明一下CyclicBarrier和CountDownLatch的区别? CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们的侧重点不同: ①Count ...

  3. Countdownlatch、CyclicBarrier、join区别

    1.join 模拟现在有三个worker,采用join的方法控制: package org.pbccrc.org.pbccrc.thread;public class Test {public sta ...

  4. CyclicBarrier和CountDownLatch的用法与区别

    前言 CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到. 本文将会对两者进行分析,记录他们的用法和区别. ...

  5. CyclicBarrier和CountDownLatch使用上的区别

    2018.12.12更新 在学习了CyclicBarrier之后发现,CyclicBarrier也可以实现跟CountDownLatch类似的功能,只需要在它的parties中多设置一个数,将主线程加 ...

  6. Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同

    CyclicBarrier 和 CountDownLatch 有什么不同? CyclicBarrier作用 CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻 ...

  7. Java并发编程之CyclicBarrier和CountDownLatch

    1.CyclicBarrier简介 CyclicBarrier(栅栏):拦截一组线程并使其阻塞,直到其内部的计数器归零,再唤醒所有的阻塞线程继续执行任务. 基础属性 public class Cycl ...

  8. CyclicBarrier 和CountDownLatch使用详解

    http://xijunhu.iteye.com/blog/713433 http://www.blogjava.net/jlins-you/archive/2012/04/24/376516.htm ...

  9. CyclicBarrier及CountDownLatch的使用

    CountDownLatch位于java.util.concurrent包下,是JDK1.5的并发包下的新特性. 首先根据Oracle的官方文档看看CountDownLatch的定义: A synch ...

最新文章

  1. Boruvka求最小生成树
  2. Oracle单机版开机自启动
  3. 如何安装docker-compose
  4. HTML5 拖拽的简单实践
  5. 自己写的sqlHelper 以及读取配置文件
  6. 批量迁移oracle表存储
  7. html 纯css 树形结构,纯css实现树形结构方法教程
  8. 非常有趣的古越及吴语-台州话
  9. MySQL instr()函数
  10. C++一天一个程序(八)
  11. 白话说编程之java线程
  12. w7如何调出计算机图标来,W7电脑系统怎么显示桌面图标
  13. Spring中获取泛型类型
  14. 《推荐系统笔记(四)》svd的python计算实例
  15. SENSOR DVP接口介绍
  16. 美股-史考特(Scottrade)开户详细说明
  17. php生成pdf中文断码_php在线生成pdf中文乱码完美解决“ | 学步园
  18. el-input输入11位手机号,边输入边验证手机号码格式
  19. 数据库系统原理选择题总结
  20. 大象流的危害以及处理

热门文章

  1. 如何把主机系统上传到服务器,主机系统上传到服务器
  2. python数据库模糊查询_python中数据库like模糊查询方式
  3. matlab矩阵乘法与打印
  4. html模板引擎 字符串长度,Web前端模板引擎の字符串模板
  5. jmeter学习指南之深入分析跨域传递cookie
  6. 人类又双叒叕输了,就没人能管管这条“狗”吗?
  7. appendChild append insertBefore prepend
  8. 马王堆汉墓帛书‧老子甲本——道经
  9. 孰轻孰重:可穿戴式设备的助益与风险
  10. HTML基础笔记-02