CountDownLatch:

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 
用给定的计数初始化 CountDownLatch。由于调用了 countDown() 
方法,所以在当前计数到达零之前,await 
方法会一直受阻塞。之后,会释放所有等待的线程,await 
的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。

CountDownLatch 很适合用来将一个任务分为n个独立的部分,等这些部分都完成后继续接下来的任务,CountDownLatch 只能触发一次,计数值不能被重置。

package com.thread;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*** * @author Administrator*该程序用来模拟发送命令与执行命令,主线程代表指挥官,新建3个线程代表战士,战士一直等待着指挥官下达命令,*若指挥官没有下达命令,则战士们都必须等待。一旦命令下达,战士们都去执行自己的任务,指挥官处于等待状态,战士们任务执行完毕则报告给*指挥官,指挥官则结束等待。*/
public class CountdownLatchTest {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool(); //创建一个线程池final CountDownLatch cdOrder = new CountDownLatch(1);//指挥官的命令,设置为1,指挥官一下达命令,则cutDown,变为0,战士们执行任务final CountDownLatch cdAnswer = new CountDownLatch(3);//因为有三个战士,所以初始值为3,每一个战士执行任务完毕则cutDown一次,当三个都执行完毕,变为0,则指挥官停止等待。        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(); //任务执行完毕,返回给指挥官,cdAnswer减1。                    } catch (Exception e) {e.printStackTrace();}                }};service.execute(runnable);//为线程池添加任务
        }        try {Thread.sleep((long)(Math.random()*10000));System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令");                        cdOrder.countDown(); //发送命令,cdOrder减1,处于等待的战士们停止等待转去执行任务。System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果");    cdAnswer.await(); //命令发送后指挥官处于等待状态,一旦cdAnswer为0时停止等待继续往下执行System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果");    } catch (Exception e) {e.printStackTrace();}                service.shutdown(); //任务结束,停止线程池的所有线程
}
}

程序运行结果如下:

线程pool-1-thread-2正准备接受命令
线程pool-1-thread-3正准备接受命令
线程pool-1-thread-1正准备接受命令
线程main即将发布命令
线程pool-1-thread-2已接受命令
线程pool-1-thread-3已接受命令
线程pool-1-thread-1已接受命令
线程main已发送命令,正在等待结果
线程pool-1-thread-2回应命令处理结果
线程pool-1-thread-1回应命令处理结果
线程pool-1-thread-3回应命令处理结果
线程main已收到所有响应结果

CyclicBarrier:

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。

CyclicBarrier可以多次重复使用

public class CyclicBarrierTest {public static void main(String[] args) throws IOException, InterruptedException {//如果将参数改为4,但是下面只加入了3个选手,这永远等待下去//Waits until all parties have invoked await on this barrier. CyclicBarrier barrier = new CyclicBarrier(3);ExecutorService executor = Executors.newFixedThreadPool(3);executor.submit(new Thread(new Runner(barrier, "1号选手")));executor.submit(new Thread(new Runner(barrier, "2号选手")));executor.submit(new Thread(new Runner(barrier, "3号选手")));executor.shutdown();}
}class Runner implements Runnable {// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)private CyclicBarrier barrier;private String name;public Runner(CyclicBarrier barrier, String name) {super();this.barrier = barrier;this.name = name;}@Overridepublic void run() {try {Thread.sleep(1000 * (new Random()).nextInt(8));System.out.println(name + " 准备好了...");// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
            barrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println(name + " 起跑!");}
}

程序运行结果如下:

3号选手 准备好了...
2号选手 准备好了...
1号选手 准备好了...
1号选手 起跑!
2号选手 起跑!
3号选手 起跑!

转载于:https://www.cnblogs.com/tartis/p/6801946.html

CountDownLatch和cyclicbarrier的使用相关推荐

  1. Java并发编程之CountDownLatch、CyclicBarrier和Semaphore

    前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...

  2. Java的CountDownLatch和CyclicBarrier的理解和区别

    CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...

  3. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

  4. Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarr ...

  5. 秒懂 CountDownLatch 与 CyclicBarrier 使用场景

    作者 | pony-zi 来源 | https://blog.csdn.net/zzg1229059735/article/details/61191679 相信每个想深入了解多线程开发的Java开发 ...

  6. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  7. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  8. JUC 中的多线程协作工具类:CountDownLatch 和 CyclicBarrier

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 最近在学习 ...

  9. CountDownLatch、CyclicBarrier、Semaphore的区别,你知道吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:是时候扔掉Postman了,又一个被低估的IDEA插件出来了...个人原创+1博客:点击前往,查看更多 链接:h ...

  10. JAVA所有选手就位后比赛开始_Java多线程-CountDownLatch、CyclicBarrier、Semaphore

    上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...

最新文章

  1. UIUC教授季姮:叫我带头人,而不是女性带头人(附视频)
  2. SAP ByD 期末结账步骤简化(不完整)方法
  3. C 简单瞎搞题(牛客练习赛22)(bitset优化dp)
  4. C#LeetCode刷题之#520-检测大写字母(Detect Capital)
  5. 创意油墨飞溅效果的绿树矢量素材
  6. fgui的ui管理框架_DCET: Unity3D客户端和.Net Core服务器双端框架,支持代码全热更(包括FGUI和双端行为树)...
  7. C语言程序设计 课程设计报告
  8. 思科网络综合实验(服务器,三层交换机,路由器)
  9. JS 模拟手机页面文件的下拉刷新
  10. MMORPG的常规技能系统
  11. MOGRT动态图标模板 爱情元素手绘爱心特效pr视频模板
  12. Linux ln 命令是什么?C/C++代码实现
  13. pg批量插入_postgresql大批量数据导入方法
  14. [N1BOOK PARTofPWN] ROP本地
  15. 一分钟了解阿里云产品:弹性伸缩概述
  16. mp3怎么转换成mp4?
  17. CLRS 6.3建堆
  18. Java 字符串拆分
  19. 汇编两个十进制数相乘,以二进制和十六进制分别输出
  20. 怎么样启用小米8 探索版 屏幕指纹版的ROOT权限

热门文章

  1. 取石子游戏(斐波那契博弈)
  2. 数据结构—树(大纲)
  3. C#基础13:预编译指令
  4. bzoj 3374: [Usaco2004 Mar]Special Serial Numbers 特殊编号
  5. 2017 Multi-University Training Contest - Team 7:1011. Kolakoski(模拟)
  6. [Python] 最常见括号()、[]、{}的区别
  7. 吴恩达神经网络和深度学习-学习笔记-14-学习率衰减
  8. [深度学习] 神经网络中的 batch 和 epoch
  9. Python实现Kubernetes Operator
  10. git原理和常用操作