CountDownLatch和cyclicbarrier的使用
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的使用相关推荐
- Java并发编程之CountDownLatch、CyclicBarrier和Semaphore
前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...
- Java的CountDownLatch和CyclicBarrier的理解和区别
CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...
- Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
2019独角兽企业重金招聘Python工程师标准>>> 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarr ...
- 秒懂 CountDownLatch 与 CyclicBarrier 使用场景
作者 | pony-zi 来源 | https://blog.csdn.net/zzg1229059735/article/details/61191679 相信每个想深入了解多线程开发的Java开发 ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...
- JUC 中的多线程协作工具类:CountDownLatch 和 CyclicBarrier
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 最近在学习 ...
- CountDownLatch、CyclicBarrier、Semaphore的区别,你知道吗?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:是时候扔掉Postman了,又一个被低估的IDEA插件出来了...个人原创+1博客:点击前往,查看更多 链接:h ...
- JAVA所有选手就位后比赛开始_Java多线程-CountDownLatch、CyclicBarrier、Semaphore
上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...
最新文章
- UIUC教授季姮:叫我带头人,而不是女性带头人(附视频)
- SAP ByD 期末结账步骤简化(不完整)方法
- C	简单瞎搞题(牛客练习赛22)(bitset优化dp)
- C#LeetCode刷题之#520-检测大写字母(Detect Capital)
- 创意油墨飞溅效果的绿树矢量素材
- fgui的ui管理框架_DCET: Unity3D客户端和.Net Core服务器双端框架,支持代码全热更(包括FGUI和双端行为树)...
- C语言程序设计 课程设计报告
- 思科网络综合实验(服务器,三层交换机,路由器)
- JS 模拟手机页面文件的下拉刷新
- MMORPG的常规技能系统
- MOGRT动态图标模板 爱情元素手绘爱心特效pr视频模板
- Linux ln 命令是什么?C/C++代码实现
- pg批量插入_postgresql大批量数据导入方法
- [N1BOOK PARTofPWN] ROP本地
- 一分钟了解阿里云产品:弹性伸缩概述
- mp3怎么转换成mp4?
- CLRS 6.3建堆
- Java 字符串拆分
- 汇编两个十进制数相乘,以二进制和十六进制分别输出
- 怎么样启用小米8 探索版 屏幕指纹版的ROOT权限
热门文章
- 取石子游戏(斐波那契博弈)
- 数据结构—树(大纲)
- C#基础13:预编译指令
- bzoj 3374: [Usaco2004 Mar]Special Serial Numbers 特殊编号
- 2017 Multi-University Training Contest - Team 7:1011. Kolakoski(模拟)
- [Python] 最常见括号()、[]、{}的区别
- 吴恩达神经网络和深度学习-学习笔记-14-学习率衰减
- [深度学习] 神经网络中的 batch 和 epoch
- Python实现Kubernetes Operator
- git原理和常用操作