并发编程之CountDownLatch
在前面的两篇文章中我们分别用volatile、notify()和wait()分别实现了一个场景,我们再来回顾一下前面的场景:在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程结束,t1线程继续执行,直到循环结束。看过上篇文章的应该知道上篇文章我们是用notify()和wait()配合来实现线程之间的交互的,但是这种方法不是很好理解,而且写起来比较麻烦,在notify()之后必须要wait()才能立即释放锁,而且wait()方法执行之前必须是要先获得锁的,这就意味着wait()方法必须在synchronized方法或者是synchronized代码块之中来执行,这并不是很方便,本文中我们将用另一种更为简单且容易理解的方式来实现这个场景,下面直接看代码:
package com.fanjf.thread; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; public class Mycontainer3 {
static List<Integer> integers = new ArrayList<>();
final static Object object = new Object();
static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
System.out.println("t1启动");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
for(int i=0;i<10;i++){
integers.add(i);
if(integers.size()==5){
latch.countDown();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("add:"+i); }
System.out.println("t1结束"); }
}).start(); new Thread(new Runnable() {
public void run() {
System.out.println("t2启动");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2结束"); } }).start();
} }
执行结果如下:
t1启动
t2启动
add:0
add:1
add:2
add:3
t2结束
add:4
add:5
add:6
add:7
add:8
add:9
t1结束
很明显,这个结果跟我们的描述是一致的,现在来解释一下代码的意思,java并发包中为我们提供了一个CountDownLatch类,这个类的构造方法中可以传一个int值,首先线程t2执行await()方法,线程t1执行add操作,当size等于5时执行countDown(),这个countDown()会把传入的int值减1,只有当这个值减为0时,t2线程才能执行,所以当size等于5时此时值会减为0,t2就会继续执行了。
并发编程之CountDownLatch的更多相关文章
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
- Java并发编程之CountDownLatch
一.场景描述 在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景 例如:百米赛跑,十名运动员同时起跑,由于速度的快慢,肯定有先到达和后到达的,而终点有个统计成绩的仪器,当所有选手到达终点时 ...
- 多线程进阶——JUC并发编程之CountDownLatch源码一探究竟
1.学习切入点 JDK的并发包中提供了几个非常有用的并发工具类. CountDownLatch. CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手段.本文将介绍Coun ...
- Java并发编程之CountDownLatch的用法
一.含义 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待, ...
- 并发编程之:CountDownLatch
大家好,我是小黑,一个在互联网苟且偷生的农民工. 先问大家一个问题,在主线程中创建多个线程,在这多个线程被启动之后,主线程需要等子线程执行完之后才能接着执行自己的代码,应该怎么实现呢? Thread. ...
- 并发编程之 Exchanger 源码分析
前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange -- 交换器.用于 ...
- 并发编程之J.U.C的第二篇
并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类 ...
- [转载]并发编程之Operation Queue和GCD
并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...
- Java并发编程之CAS
CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ...
随机推荐
- PM过程能力成熟度3级
2级PM已经可以把项目管理起来了.如果这时候,企业只有一个PM,那这种程度的管理,只要逐渐深化,就可以一直维持下去. 然鹅,现实总是复杂很多... 公司会在PM建立2级的过程管理后,提高所有项目的可视 ...
- pipe size设置
我所用的软件架构,使用pipe来实现线程之间的大量数据的传输.在实际操作中,pipe中传输的是数据的指针,而不是数据本身. 但是在调试过程中,我发现,如果我尝试往pipe里面write10000个指 ...
- js坚持不懈之17:onmousedown、onmouseup 以及 onclick 事件
<!DOCTYPE html> <html> <body> <div onmouseover = "mOver(this)" onmous ...
- ABP之N层架构
介绍 应用程序代码库的分层是一种广泛接受的技术,有助于降低复杂性并提高代码的可重用性. 为了实现分层体系结构,ASP.NET Boilerplate遵循领域驱动设计(DDD)的原则. 领域驱动设计(D ...
- 身份认证功能chiro的使用
package com.cun;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apa ...
- zoj 3602
链接 [https://vjudge.net/contest/293343#problem/C] 题意 给你两棵树.为有多少对子树是同构的 分析 就是简单的哈希吧.对于不同结构的树对应不同的哈希值 先 ...
- Friendly Date Ranges 让日期区间更友好
把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果 ...
- Centos6.5 pppoe-server
[root@localhost network-scripts]# rpm -q rp-pppoepackage rp-pppoe is not installed ----------------- ...
- CLOUD配置审批流发消息
1.进入流程中心-工作流-流程设计中心 2.新增物料管理冻结流程 3.进入修改配置项 4.新消息节点 5.写入消息标题,内容等 6.填入接收人 7.保存后发布 8.进入流程配置中心 9.捆绑并启用 1 ...
- OpenCV4.1.0实践(2) - Dlib+OpenCV人脸特征检测
待更! 参考: python dlib opencv 人脸68点特征检测