允许一个或多个线程等待其他线程完成某一步操作。

需求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相关推荐

  1. JAVA Java多线程与并发库

    Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...

  2. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  3. Java多线程与并发库高级应用架构

    张孝祥_Java多线程与并发库高级应用 [视频介绍:] Java线程是一项非常基本和重要的技术,在偏底层和偏技术的Java程序中不可避免地要使用到Java线程技术,特别是android手机程序和游戏开 ...

  4. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  5. 并发库应用之三 线程池与定时器应用

    在TCP服务器编程模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程.如果访问服务器的客户端很多,那么服务器 ...

  6. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一 ...

  7. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  8. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  9. 线程并发库和线程池的作用_并发–顺序线程和原始线程

    线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...

最新文章

  1. 程序员,唯有锻炼与读书不能辜负
  2. Android Studio中统一管理版本号引用配置
  3. Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
  4. C语言的本质(3)——整数的本质与运算
  5. vue2.0搭建vue手脚架(vue-cli)
  6. markdown 公式_【建议收藏】数学公式如何用Markdown优雅地写出来
  7. Java自动部署maven_Maven+Tomcat8 实现自动化部署的方法
  8. 如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误
  9. xml不利于调试_流利的接口不利于维护
  10. String类、StringBuffer类、StringBuilder类的区别
  11. 宁德时代考虑50亿美元在北美建厂 目标年产能最高80 GWh
  12. Linux常用命令集锦(一)
  13. 1782: [Usaco2010 Feb]slowdown 慢慢游
  14. 标准模块 threading
  15. 电脑、手机装机必备软件的抉择[土豆-侃天下]
  16. python使用PIL把透明背景图片转成白色背景
  17. SPSS步骤|卡方检验详细操作和结果分析
  18. pc游戏平台_如何提高您在PC游戏中的目标
  19. 心肌损伤的标志物题库【1】
  20. 博士论文-基于生成对抗网络的图像合成-阅读笔记

热门文章

  1. python中的switch语句_python技巧 switch case语句
  2. Vue之非单文件组件介绍
  3. linux操作系统中不能挂载nfts格式的文件系统,Linux 下无法挂载windows的ntfs文件系统...
  4. websphere配置oracle数据源,Websphere - 配置Oracle数据源
  5. 算法提高 输入输出格式练习(java)
  6. Spring MVC,Spring Boot文件上传
  7. html实现验证码效果,js实现验证码功能
  8. 删除Dataframe前N行或后N行
  9. 服务器文件同步本站,服务器文件同步
  10. mysql连接查询on_MySql 连接查询中 on 和 where 的区别