并发库之CountDownLatch
允许一个或多个线程等待其他线程完成某一步操作。
需求1:
如果有三个线程,主线程,Thread1,Thread2.假设主线程必须等待线程1和线程2执行完毕,它才能继续往下执行。我们可能首先考虑到的是使用join方法。
publicclass JoinClient {
public static void main(String[] args) throwsInterruptedException {
Threadt1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("nicky");
System.out.println("belly");
}
},"Thread1");
Threadt2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("avria");
}
},"Thread2");
t1.start();
t2.start();
t1.join();//等待線程1執行完畢
t2.join();//等待線程2執行完畢
System.out.println("All ThreadRunned!");
}
}
输出结果:
nicky
avria
belly
All Thread Runned!
我们可以看到主线程是在等待线程1和线程2执行完毕之后才执行的。
需求2:如果主线程只需要等待线程里面某一个代码执行片段执行完毕,则就可以往下执行了。这时候Join就不适用了,因为Join只能等待线程执行完毕,线程已经不存活。这时候CountDownLatch就可以派上用场了。
CountDownLatch构造函数需要接受一个int类型的数值,传入的数值依据你希望有几个点完成之后,然后等待的线程就可以继续执行,否则就继续等。而且这个数值不能为空。
当我们调用一次CountDownLatch.countDown方法,这个数值就会减一。一直到为0,表示所有的点都已经过了。然后等待的线程可以继续执行了。
那是什么来检测这个值为0呢?这就是需要调用CountDownLatch.
await方法,它会阻塞当前线程,直到这个数值为0. 有时候可能某得线程执行的很慢,我们在等了一定的时间后,不想继续等下去,那么你可以设定一个值。await(long, TimeUnit ) 等待一定时间后,不等了。不阻塞等待的线程了。
publicclassCountDownLatchClient {
private static CountDownLatch cdl =newCountDownLatch(2);
public static void main(String[] args) throwsInterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("nicky");
cdl.countDown();
System.out.println("belly");
}
},"Thread1").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("avria");
cdl.countDown();
}
},"Thread2").start();
cdl.await();//等待所有線程完成
System.out.println("All ThreadRunned!");
}
}
输出结果:
nicky
belly
avria
All Thread Runned!
如果我现在有三个地方调用countDown方法,但是数值我们还是设置的2.
看看输出结果:
publicclassCountDownLatchClient {
private static CountDownLatch cdl =newCountDownLatch(2);
public static void main(String[] args) throwsInterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("nicky");
cdl.countDown();
System.out.println("belly");
cdl.countDown();
}
},"Thread1").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("avria");
cdl.countDown();
}
},"Thread2").start();
cdl.await();//等待所有線程完成
System.out.println("All ThreadRunned!");
}
}
输出结果:
nicky
belly
All Thread Runned!
Avria
我们可以看到avria并没有在All Thread Runned!之前输出吧。为什么?因为countDown已经调用了2此,这时候await方法已经不阻塞了。
我们在看看 等待一段时间,就不阻塞的情况:
publicclassCountDownLatchClient {
private static CountDownLatch cdl =newCountDownLatch(3);
public static void main(String[] args) throwsInterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("nicky");
cdl.countDown();
System.out.println("belly");
cdl.countDown();
}
},"Thread1").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("avria");
cdl.countDown();
}
},"Thread2").start();
cdl.await(2,TimeUnit.SECONDS);//等待所有線程完成
System.out.println("All ThreadRunned!");
}
}
现在我们再看输出结果:
avria
All Thread Runned!
nicky
belly
注意:一般情况下我们都会把countDown放在finally,确保她无论如何也必须执行。
Join 和 CountDownLatch比较
Join: 是不断的去检测线程是否还活着,如果还活着继续阻塞,否则,就调用this.notifyAll,唤醒当前线程。
CountDownLatch:
他提供了更加灵活的控制,不仅可以等待线程执行完毕,还可以在执行某一步操作的时候,就让等待的线程不用等了。
并发库之CountDownLatch相关推荐
- JAVA Java多线程与并发库
Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...
- java基础巩固笔记(5)-多线程之线程并发库
2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...
- Java多线程与并发库高级应用架构
张孝祥_Java多线程与并发库高级应用 [视频介绍:] Java线程是一项非常基本和重要的技术,在偏底层和偏技术的Java程序中不可避免地要使用到Java线程技术,特别是android手机程序和游戏开 ...
- Java多线程与线程并发库高级应用笔记
以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...
- 并发库应用之三 线程池与定时器应用
在TCP服务器编程模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程.如果访问服务器的客户端很多,那么服务器 ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
2019独角兽企业重金招聘Python工程师标准>>> Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一 ...
- Java线程新特征——Java并发库
一.线程池 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...
- 线程并发库和线程池的作用_线程和并发介绍
线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...
- 线程并发库和线程池的作用_并发–顺序线程和原始线程
线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...
最新文章
- 程序员,唯有锻炼与读书不能辜负
- Android Studio中统一管理版本号引用配置
- Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
- C语言的本质(3)——整数的本质与运算
- vue2.0搭建vue手脚架(vue-cli)
- markdown 公式_【建议收藏】数学公式如何用Markdown优雅地写出来
- Java自动部署maven_Maven+Tomcat8 实现自动化部署的方法
- 如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误
- xml不利于调试_流利的接口不利于维护
- String类、StringBuffer类、StringBuilder类的区别
- 宁德时代考虑50亿美元在北美建厂 目标年产能最高80 GWh
- Linux常用命令集锦(一)
- 1782: [Usaco2010 Feb]slowdown 慢慢游
- 标准模块 threading
- 电脑、手机装机必备软件的抉择[土豆-侃天下]
- python使用PIL把透明背景图片转成白色背景
- SPSS步骤|卡方检验详细操作和结果分析
- pc游戏平台_如何提高您在PC游戏中的目标
- 心肌损伤的标志物题库【1】
- 博士论文-基于生成对抗网络的图像合成-阅读笔记
热门文章
- python中的switch语句_python技巧 switch case语句
- Vue之非单文件组件介绍
- linux操作系统中不能挂载nfts格式的文件系统,Linux 下无法挂载windows的ntfs文件系统...
- websphere配置oracle数据源,Websphere - 配置Oracle数据源
- 算法提高 输入输出格式练习(java)
- Spring MVC,Spring Boot文件上传
- html实现验证码效果,js实现验证码功能
- 删除Dataframe前N行或后N行
- 服务器文件同步本站,服务器文件同步
- mysql连接查询on_MySql 连接查询中 on 和 where 的区别