并发工具类的使用 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 ...
随机推荐
- 多因素线性回归|adjusted R^2|膨胀系数|非线性回归|Second-order model with 1 independent variable|Interaction model with 2 independent variables|偏相关|fraction[a]|contribution
多因素线性回归 系数由最小二乘法得到 R^2;adjusted R^2:变量变多之后,r^2自然变大,但是这不是反应客观事实,所以引入了adjusted R^2 使用散点图看独立性,也可以使用软件,c ...
- javascript 实现最简单的阶乘!
<script type='text/javascript'> window.onload = get(5); function get(n){ document.w ...
- FPGA时序分析
更新于20180823 时序检查中对异步复位电路的时序分析叫做()和()? 这个题做的让人有点懵,我知道异步复位电路一般需要做异步复位.同步释放处理,但不知道这里问的啥意思.这里指的是恢复时间检查和移 ...
- 如何回收VCSA 6自带的vPostgres数据库空间
最近有学生连续反应由于VCSA磁盘空间满了,导致服务无法正常启动,寻求压缩数据库空间的问题.首先说下,VCSA的数据库是没办法图形界面管理的, 它的内置vPostgres数据库的管理只能通过命令行来完 ...
- 收集到的技术相关网址——delphi
1.DLL封装登录框架实现代码复用 https://www.cnblogs.com/wenwencao/articles/1333659.html
- python3下scrapy爬虫(第七卷:编辑器内执行scrapy)
之前我们都是在终端切入到scrapy的路境内执行爬虫的,你要多敲多少行的字节,所以这次我们谈谈如何在编辑器里执行,这个你可以用在爬虫中,当你使用PYTHONWEB开发时尽量不要在编辑器内启动端口服务那 ...
- 百度AI技术
利用百度提供接口,实现智能语音 语音合成 -- TTS(text to speech) 注册 在 ai.baidu.com 页面中点击 控制台 ,弹出登陆 / 注册页面 创建应用 登陆成功后,点击左侧 ...
- java面试题 -- 基础
1.抽象和封装的不同点抽象和封装是互补的概念.一方面,抽象关注对象的行为.另一方面,封装关注对象行为的细节.一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略.2.重载 ...
- 领域驱动(DDD)之我见,基于Golang实现
分享一点不成熟的理解,还请本着交流进步的大原则喷之.从去年开始接触和套用DDD以来,已经有1年多时间了.也先后在2个生产项目中主导应用. 一.一些概念 DDD经典分层: 分层架构的一个重要原则是:每层 ...
- pycharm中无法导入pip安装的包
https://blog.csdn.net/mdxiaohu/article/details/82430060 2020.1.20 练习通过python操作数据库的时候需要导入一个包,因为看代码写的是 ...