并发编程-concurrent指南-计数器CountDownLatch
java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成。
CountDownLatch 以一个给定的数量初始化。countDown() 每被调用一次,这一数量就减一。通过调用 await() 方法之一,线程可以阻塞等待这一数量到达零。
利用它可以实现类似计数器的功能。
比如有一个任务A,它要等待其他5个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
举个例子:
有五个工人在为老板干活,这个老板有一个习惯,就是当五个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:五个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,Worker代表工人,Boss代表老板
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(5);//五个工人
//工人
Worker worker1 = new Worker(countDownLatch);
new Thread(worker1).start();
Worker worker2 = new Worker(countDownLatch);
new Thread(worker2).start();
Worker worker3 = new Worker(countDownLatch);
new Thread(worker3).start();
Worker worker4= new Worker(countDownLatch);
new Thread(worker4).start();
Worker worker5 = new Worker(countDownLatch);
new Thread(worker5).start();
//老板
Boss boss = new Boss(countDownLatch);
new Thread(boss).start();
}
}
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; /**
* 工人
*/
public class Worker implements Runnable{
private CountDownLatch countDownLatch;
public Worker(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
} @Override
public void run() {
System.out.println(Thread.currentThread().getName()+",工人在干活。。。");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",工人干活结束。。。");
countDownLatch.countDown();
}
}
import java.util.concurrent.CountDownLatch; /**
* 老板
*/
public class Boss implements Runnable{
private CountDownLatch countDownLatch;
public Boss(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
} @Override
public void run() {
System.out.println("老板等待所有工人干活完成。。");
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有工人干活完成,开始检查。。");
}
}
结果:
Thread-0,工人在干活。。。
Thread-1,工人在干活。。。
Thread-3,工人在干活。。。
Thread-2,工人在干活。。。
Thread-4,工人在干活。。。
老板等待所有工人干活完成。。
Thread-2,工人干活结束。。。
Thread-3,工人干活结束。。。
Thread-1,工人干活结束。。。
Thread-4,工人干活结束。。。
Thread-0,工人干活结束。。。
所有工人干活完成,开始检查。。
适用场景:
CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
源码地址:https://github.com/qjm201000/concurrent_countDownLatch.git
并发编程-concurrent指南-计数器CountDownLatch的更多相关文章
- JAVA并发编程之倒计数器CountDownLatch
CountDownLatch 的使用场景:在主线程中开启多线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后汇总返回结果. 我把源码中的英文注释全部删除,写上自己的注释.就剩下 70 行不到的 ...
- 并发编程-concurrent指南-原子操作类-AtomicInteger
在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger
- 并发编程-concurrent指南-线程池ExecutorService的实例
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...
- 并发编程-concurrent指南-ConcurrentMap
ConcurrentMap 是个接口,你想要使用它的话就得使用它的实现类之一. ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合: 在原有java.ut ...
- 并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque
LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元 ...
- 并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue
LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlocki ...
- 并发编程-concurrent指南-原子操作类-AtomicLong
可以用原子方式更新的 long 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicLong 可用在应用程序中(如以原子方式增加的序列号), ...
- 并发编程-concurrent指南-原子操作类-AtomicBoolean
类AtomicBoolean
- 并发编程-concurrent指南-ReadWriteLock-ReentrantReadWriteLock(可重入读写锁)
几个线程都申请读锁,都能获取: import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantRea ...
随机推荐
- WPF字体图标——FontAwesom
原文:WPF字体图标--FontAwesom 版权声明:本文为[CSDN博主:松一160]原创文章,未经允许不得转载. https://blog.csdn.net/songyi160/article/ ...
- c# 守护进程,WPF程序自守护
原文:c# 守护进程,WPF程序自守护 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/79035246 如何 ...
- WPF Path.Data 后台代码赋值
Path path = new Path(); string sData = "M 250,40 L200,20 L200,60 Z"; var converter = TypeD ...
- Web应用程序和网站的区别
1项目就是一个应用程序.在VS中查看的时候,项目中建立的一般处理程序,有两个文件,网站只有一个.写个代码测试,发现在代码层次上没有2再有就是项目中的一般处理程序有命名空间,而网站中的没有.WEB网站每 ...
- ASP POST请求
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 【转】Powerdesigner逆向工程从sql server数据库生成pdm
第一步:打开"控制面板"中的"管理工具" 第二步:点击"管理工具"然后双击"数据源(odbc)" 第三步:打开之后,点击 ...
- ELINK离线编程器常见问题
Q1 编程器是否可以接JTAG JTAG接口已经包含SWD接口引脚,按以下引脚对应接线即可: SWDIO->目标板JTAG 的JTMS SWCLK->目标板JTAG 的JTCK Q2 PC ...
- Win10《芒果TV - Preview》更新v3.1.31.0,全新播放页蜕变,预加载提速技术
Win10<芒果TV - Preview>(商店内测版) v3.1.31.0 于2016年11月21日星期一晚上九点半登陆商店 主要是全面升级改造桌面播放页,新增观看互动评论.猜你喜欢功能 ...
- Android零基础入门第26节:layout_gravity和gravity大不同
原文:Android零基础入门第26节:layout_gravity和gravity大不同 上一期我们一起学习了LinearLayout线性布局的方向.填充模型和权重,本期来一起学习LinearLay ...
- 使用QPainter的drawPixmap()绘制多幅图片 good
众所周知,使用QLabel的setPixmap()就可以将图片显示出来,做视屏解码后显示也可以如此.但是为何我今天还要费力使用基函数drawPixmap()来做绘图?理由有这么些吧: 1.使用QLab ...