Latch:门闩。一种线程通信的方式;当程序不涉及同步,仅仅需要线程通信的时候,使用synchronize或者lock的线程通信等待唤醒机制,就显得太重了;

这时候,可以考虑使用信号量类:CountDownLatch,cylicbarrier,semaphore

CountDownLatch是一个多线程控制工具类。可以实现计数器的功能。

CountDownLatch的两种应用场景:(不能实现多个线程顺序执行!)

1. 让某线程等待其他线程执行完毕,再开始执行;

2. 让多个线程同时开始并行执行;

构造器:

// 传入一个count,指定要等待的线程个数
public CountDownLatch(int count)

主要方法:

// 调用await的线程会被挂起,直到count==0,才会继续执行。
public void await(){}; // 等待一定时间,count还没有为0,线程继续执行
public boolean await(long timeout, TimeUnit unit){}; // 将count值减1,一般在线程执行结束,调用此方法,代表计数器减1.
public void countDown() {};

第一种场景:

让某线程,等待n个线程执行结束,再继续执行;

创建一个Task类

public class Task implements Runnable {
private String name;
private CountDownLatch latch;
// 线程需要CountDownLatch对象
public Task(CountDownLatch latch, String name) {
this.latch = latch;
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(this.name + " Over");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); // 执行完毕,计数器减一
}
}
}

主方法:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(3);
Task task_A = new Task(latch, "A");
Task task_B = new Task(latch, "B");
Task task_C = new Task(latch, "C");
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(task_A);
executorService.submit(task_B);
executorService.submit(task_C);
executorService.shutdown();
// 挂起mian线程,等待计数器置0,也就是三个线程执行完毕。
latch.await();
System.out.println(Thread.currentThread().getName());
}
}

运行结果:

A Over
B Over
C Over
main // 等待三个线程执行完毕,main线程执行

第二种场景:

其实跟第一种,基本一样,只不过反着来;await所有的用户线程,让main线程先行,计数器减一,为0;接着用户线程就会一起启动;

这个方式,对于并发其实没有什么用,主要用于并行的场景;真正的同时启动多个线程。

【JUC】7.CountDownLatch的更多相关文章

  1. 【1】【JUC】JDK1.8源码分析之ReentrantLock

    概要: ReentrantLock类内部总共存在Sync.NonfairSync.FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQ ...

  2. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  3. 【1】【JUC】JDK1.8源码分析之ArrayBlockingQueue,LinkedBlockingQueue

    概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Co ...

  4. 【JUC】阻塞队列&生产者和消费者

    阻塞队列 线程1往阻塞队列添加元素[生产者] 线程2从阻塞队列取出元素[消费者] 当队列空时,获取元素的操作会被阻塞 当队列满时,添加元素的操作会被阻塞 阻塞队列的优势:在多线程领域,发生阻塞时,线程 ...

  5. 【JUC】JDK1.8源码分析之CountDownLatch(五)

    一.前言 分析完了CyclicBarrier后,下面分析CountDownLatch,CountDownLatch用于同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成.CountDownL ...

  6. 【JUC】CountDownLatch

    因为在调用端的异步中,需要调用其他多个服务获取数据再汇总结果返回,所以用到了CountDownLatch CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个 ...

  7. 【JUC】CountDownLatch和Java枚举的使用例子

    public enum CountryEnum { ONE(1,"春"), TWO(2,"夏"), THREE(3,"秋"), FOUR(4 ...

  8. 【JUC】JUC锁框架综述

    一.前言 在分析完了集合框架后,很有必要接着分析java并发包下面的源码,JUC(java.util.concurrent)源码也是我们学习Java迈进一步的重要过程.我们分为几个模块进行分析,首先是 ...

  9. 【1】【JUC】Condition和生产者消费者模型

    本篇文章将介绍Condition的实现原理和基本使用方法,基本过程如下: 1.Condition提供了await()方法将当前线程阻塞,并提供signal()方法支持另外一个线程将已经阻塞的线程唤醒. ...

随机推荐

  1. matlab学习笔记8 基本绘图命令-LineSpec线条设定

    一起来学matlab-matlab学习笔记8 基本绘图命令_4 LineSpec线条设定 觉得有用的话,欢迎一起讨论相互学习~Follow Me 绘图函数接受线条设定作为参数并相应地修改生成的图形.您 ...

  2. TensorFlow-线程回归模型

    实验目的: 方程:y = Wx + b 通过大量的(x, y)坐标值,模型可以计算出接近W和b的值 实验步骤: 第一步:生成线程回归方程模型所需要的数据 import numpy as np impo ...

  3. 【tensorflow基础】Tensorpack-API

    安装 pip install tensorpack 使用 参考 1. Tensorpack: 2. Tensorpack,一个基于TensorFlow的神经网络训练界面,源码包含很多示例: 完

  4. WebViewJavascriptBridge js跟app的交互框架

    https://github.com/marcuswestin/WebViewJavascriptBridge 参考: https://www.cnblogs.com/LiLihongqiang/p/ ...

  5. [LeetCode] 107. Binary Tree Level Order Traversal II 二叉树层序遍历 II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  6. Jenkins - 构建流水线

    1 - 以流水线的方式进行构建 关联多任务形成流水线的两种方法 通过定义项目的后续项目,将项目直接关联起来按顺序执行, 另外定义一个用于统筹管理的项目,定义各项目之间的关联性,然后以流水线的方式执行 ...

  7. hadoop进阶---hadoop性能优化(一)---hdfs空间不足的管理优化

    Hadoop 空间不足,hive首先就会没法跑了,进度始终是0%. 将HDFS备份数降低 将默认的备份数3设置为2. 步骤:CDH–>HDFS–>配置–>搜索dfs.replicat ...

  8. springcloud 连接docker中运行的RabbitMQ消息中间件。

    参考:https://blog.51cto.com/zero01/2173288 主要是记录几个坑: 第一个坑:开始订单服务中配置文件是: #配置rabbitmq 2019.5.17 added by ...

  9. 设置程序崩溃时产生 core 文件的配置

    /* 不限制 core 文件的大小 */ ulimit -c unlimited /* 使用 pid 进行命名 */ echo " > /proc/sys/kernel/core_us ...

  10. c++之vector容器入门

    对于c++的vector容器的函数应用: #include<string> #include<iostream> #include<vector> using na ...