并发工具类的使用 CountDownLatch,CyclicBarrier,Semaphore,Exchanger
1.CountDownLatch
允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
A CountDownLatch
用给定的计数初始化。 await
方法阻塞,直到由于countDown()
方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await
调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier
。
- public class CountDownLatchTest {
- public void meeting (CountDownLatch countDownLatch) {
- System.out.println(Thread.currentThread().getName() + "到达会议室,等待开会。。。");
- try {
- countDownLatch.countDown();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- //CountDownLatch 传入线程数,当传入的线程数全部执行完成后再往后执行,否则一直等待
- CountDownLatch countDownLatch = new CountDownLatch(3);
- CountDownLatchTest countDownLatchTest = new CountDownLatchTest();
- Runnable runnable = () -> countDownLatchTest.meeting(countDownLatch);
- new Thread(runnable).start();
- new Thread(runnable).start();
- new Thread(runnable).start();
- try {
- countDownLatch.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("全部线程执行完毕");
- }
- }
2.CyclicBarrier
允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
A CyclicBarrier
支持一个可选的Runnable
命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。
- public class CyclicBarrierTest {
- public void meeting (CyclicBarrier cyclicBarrier) {
- System.out.println(Thread.currentThread().getName() + "到达会议室,等待开会。。。");
- try {
- cyclicBarrier.await();
- System.out.println(Thread.currentThread().getName() + "发言中。。。");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- //CyclicBarrier构造方法一,传入线程数,当传入的线程数全部执行完成后再往后执行,否则一直等待
- CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
- //CyclicBarrier构造方法二,传入线程数,当传入的线程数全部执行完成后再往后执行,否则一直等待;传入最后一个线程执行完成后将执行的代码 从写runnable接口
- CyclicBarrier cyclicBarrier1 = new CyclicBarrier(3, () -> System.out.println(Thread.currentThread().getName() + "已经全部到达,开始开会"));
- CyclicBarrierTest cyclicBarrierTest = new CyclicBarrierTest();
- Runnable runnable = () -> cyclicBarrierTest.meeting(cyclicBarrier1);
- new Thread(runnable).start();
- new Thread(runnable).start();
- new Thread(runnable).start();
- }
- }
3.Semaphore
一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()
都会阻塞,直到许可证可用,然后才能使用它。 每个release()
添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore
只保留可用数量的计数,并相应地执行
信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源。
- public class SemaphoreTest {
- public void method(Semaphore semaphore) {
- try {
- semaphore.acquire();
- System.out.println(Thread.currentThread().getName()+" is run ...");
- Thread.sleep(2000);
- semaphore.release();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- SemaphoreTest semaphoreTest = new SemaphoreTest();
- Semaphore semaphore = new Semaphore(10);
- while (true) {
- new Thread(() -> semaphoreTest.method(semaphore)).start();
- }
- }
- }
4.Exchanger
线程可以在成对内配对和交换元素的同步点。 每个线程在输入exchange
方法时提供一些对象,与合作者线程匹配,并在返回时接收其合作伙伴的对象。 交换器可以被视为一个的双向形式SynchronousQueue
。 交换器在诸如遗传算法和管道设计的应用中可能是有用的。
- public class ExchangerTest {
- public void a(Exchanger<String> exchanger) {
- System.out.println("a 方法开始执行。。。");
- try {
- System.out.println("a 方法开始抓取数据...");
- Thread.sleep(4000);
- System.out.println("a 方法抓取数据结束");
- String res = "12345";
- System.out.println("a 等待对比结果");
- exchanger.exchange(res);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public void b(Exchanger<String> exchanger) {
- System.out.println("b 方法开始执行。。。");
- try {
- System.out.println("b 方法开始抓取数据。。。");
- Thread.sleep(4000);
- System.out.println("b 方法抓取数据结束");
- String res = "12345";
- String value = exchanger.exchange(res);
- System.out.println("比对结果为:" + value.equals(res));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- ExchangerTest exchangerTest = new ExchangerTest();
- Exchanger<String> exchanger = new Exchanger<>();
- new Thread(() -> exchangerTest.a(exchanger)).start();
- new Thread(() -> exchangerTest.b(exchanger)).start();
- }
- }
并发工具类的使用 CountDownLatch,CyclicBarrier,Semaphore,Exchanger的更多相关文章
- 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)
目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...
- Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...
- Java并发工具类之线程间数据交换工具Exchanger
Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换.它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据.两个线程通过exchange方法交换数据,如果一个线程执行exch ...
- Java并发工具类之同步屏障CyclicBarrier
CyclicBarrier的字面意思是可以循环使用的Barrier,它要做的事情是让一个线程到达一个Barrier的时候被阻塞,直到最后一个线程到达Barrier,屏障才会放开,所有被Barrier拦 ...
- 30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验?
30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验? 前言 在本篇文章当中首先给大家介绍三个工具Semaphore, CyclicBa ...
- java中的并发工具类
在jdk的并发包里提供了几个非常有用的并发工具类.CountDownLatdch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线 ...
- Java并发编程-并发工具类及线程池
JUC中提供了几个比较常用的并发工具类,比如CountDownLatch.CyclicBarrier.Semaphore. CountDownLatch: countdownlatch是一个同步工具类 ...
- JUC 常用4大并发工具类
什么是JUC? JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西 该包的位置位于java下面的rt.jar包下面 4大常用并发工具类: Count ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
随机推荐
- java第二节课 java语法基础动手动脑
动手动脑1:枚举变量 运行EnumTest.java package test2; public class EnumTest { public static void main(String[ ...
- perf4j+logback配置 非spring 可使用注解
最近项目打算使用perf4j进行性能监控,由于项目没有使用spring,而又不想对代码入侵过高,打算使用注解的方式进行接入.perf4j采用AspectJ库实现AOP. 具体接入方法如下: logba ...
- 深入JVM内核--JVM简介
JVM概念 jvm是指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完成计算机系统. 目前主要有vmMare.visual Box和JVM三款虚拟机. JVM使用软件模拟java字节 ...
- springmvc拦截器入门及其执行顺序源码分析
springmvc拦截器是偶尔会用到的一个功能,本案例来演示一个较简单的springmvc拦截器的使用,并通过源码来分析拦截器的执行顺序的控制.具体操作步骤为:1.maven项目引入spring依赖2 ...
- 无人工地,原来是靠AI这样运行的
随着全世界逐渐进入老龄化社会,适龄工作人口将急剧减少,必然导致用工成本增加,施工方降低人工成本.提升施工效率和质量的需求会越来越强烈,数字化施工技术应用前景广阔.在过去的十年中,无人机迎来了自己发展的 ...
- python os.path 模块常用方法
代码: import os apath = os.path.abspath(__file__) # 绝对路径 dirname = os.path.dirname(apath) basename = o ...
- 使用itchat发送天气信息
微信发送当日天气情况 念头萌生 之前在浏览网站的时候发现了篇文章「玩转树莓派」为女朋友打造一款智能语音闹钟,文章中介绍了使用树莓派打造一款语音播报天气的闹钟. 当时就想照着来,也自己做个闹钟.因为一直 ...
- 添砖加瓦:snappy无损压缩算法
一.简介 Snappy(旧称:Zippy)是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,并在2011年开源.其目标并非最大压缩率或与其他压缩程序的兼容性,而是非常高的速度 ...
- leetcode_315_逆序对问题
题目描述 本题来自于Leetcode的算法题库第315题,具体题目描述如下: 给定一个nums整数数组 ,按要求返回一个counts新数组 .数组 counts 有该性质: counts[i]的值是 ...
- React Native拆包及热更新方案 · Solartisan
作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...