java线程并发库之--线程同步工具CountDownLatch用法

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

主要方法

 public CountDownLatch(int count);

 public void countDown();

 public void await() throws InterruptedException

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

例子:

public class CountDownLatchDemo {  final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  public static void main(String[] args) throws InterruptedException {  CountDownLatch latch=new CountDownLatch(2);//两个工人的协作  Worker worker1=new Worker("zhang san", 5000, latch);  Worker worker2=new Worker("li si", 8000, latch);  worker1.start();//  worker2.start();//  latch.await();//等待所有工人完成工作  System.out.println("all work done at "+sdf.format(new Date()));  }  static class Worker extends Thread{  String workerName;   int workTime;  CountDownLatch latch;  public Worker(String workerName ,int workTime ,CountDownLatch latch){  this.workerName=workerName;  this.workTime=workTime;  this.latch=latch;  }  public void run(){  System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));  doWork();//工作了  System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));  latch.countDown();//工人完成工作,计数器减一  
  }  private void doWork(){  try {  Thread.sleep(workTime);  } catch (InterruptedException e) {  e.printStackTrace();  }  }  }  }  

输出:

Worker zhang san do work begin at 2011-04-14 11:05:11
Worker li si do work begin at 2011-04-14 11:05:11
Worker zhang san do work complete at 2011-04-14 11:05:16
Worker li si do work complete at 2011-04-14 11:05:19
all work done at 2011-04-14 11:05:19

 

CountDownLatch类有3个基本元素:

  1. 初始值决定CountDownLatch类需要等待的事件的数量。
  2. await() 方法, 被等待全部事件终结的线程调用。
  3. countDown() 方法,事件在结束执行后调用。

当创建 CountDownLatch 对象时,对象使用构造函数的参数来初始化内部计数器。每次调用 countDown() 方法, CountDownLatch 对象内部计数器减一。当内部计数器达到0时, CountDownLatch 对象唤醒全部使用 await() 方法睡眠的线程们。

不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一旦计数器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法。当计数器到达0时, 全部调用 await() 方法会立刻返回,接下来任何countDown() 方法的调用都将不会造成任何影响。

此方法与其他同步方法有这些不同:

CountDownLatch 机制不是用来保护共享资源或者临界区。它是用来同步一个或者多个执行多个任务的线程。它只能使用一次。像之前解说的,一旦CountDownLatch的计数器到达0,任何对它的方法的调用都是无效的。如果你想再次同步,你必须创建新的对象。

CountDownLatch 类有另一种版本的 await() 方法,它是:

  • await(long time, TimeUnit unit): 此方法会休眠直到被中断; CountDownLatch 内部计数器到达0或者特定的时间过去了。TimeUnit 类包含了:DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, 和 SECONDS.

转载于:https://www.cnblogs.com/pypua/articles/7307648.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 766. 托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。 输入:matrix [[1,2,3,4],[5,1,…

蓝牙调试工具如何使用_使用此有价值的工具改进您的蓝牙项目:第2部分!

蓝牙调试工具如何使用This post is originally from www.jaredwolff.com. 这篇文章最初来自www.jaredwolff.com。 This is Part 2 of configuring your own Bluetooth Low Energy Service using a Nordic NRF52 series processor. If you haven’t seen Part 1 go back and ch…

gRPC快速入门记录

为什么使用grpc 1.protocl buffer一种高效的序列化结构。 2.支持http 2.0标准化协议。 http/2 1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的处理多个请求和响应,而且做到不相互影响。 2.允许客户端和服务端实现自己的数据…

微服务、分布式、云架构构建电子商务平台

大型企业分布式微服务云架构服务组件 实现模块化、微服务化、原子化、灰度发布、持续集成 分布式、微服务、云架构构建电子商务平台 commonservice eureka Netflix事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化&am…

使用Matplotlib Numpy Pandas构想泰坦尼克号高潮

Did you know, a novel predicted the Titanic sinking 14 years previously to the actual disaster???您知道吗,一本小说预言泰坦尼克号在14年前沉没到了真正的灾难中??? In 1898 (14 years before the Titanic sank), Amer…

spark 架构_深入研究Spark内部和架构

spark 架构by Jayvardhan Reddy通过杰伊瓦尔丹雷迪(Jayvardhan Reddy) 深入研究Spark内部和架构 (Deep-dive into Spark internals and architecture) Apache Spark is an open-source distributed general-purpose cluster-computing framework. A spark application is a JV…

使用faker生成测试数据

需要先安装faker模块,pip install faker 导入模块中的Faker类:from faker import Faker 实例化faker Faker() print(姓名相关) print(姓名:,faker.name()) print(名:,faker.first_name()) print(姓:,faker.last_name()) print(男姓名:,faker.name_male(…

JavaScript中的数组创建

JavaScript中的数组创建 本文转载自:众成翻译 译者:loveky 链接:http://www.zcfy.cc/article/713 原文:http://rainsoft.io/power-up-the-array-creation-in-javascript/ 数组是一个包含了对象或原始类型的有序集合。很难想象一个…

CODEVS——T1519 过路费

http://codevs.cn/problem/1519/ 时间限制: 1 s空间限制: 256000 KB题目等级 : 大师 Master题解查看运行结果题目描述 Description在某个遥远的国家里,有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路,每条道路连接着两个城市。政府规…

pca数学推导_PCA背后的统计和数学概念

pca数学推导As I promised in the previous article, Principal Component Analysis (PCA) with Scikit-learn, today, I’ll discuss the mathematics behind the principal component analysis by manually executing the algorithm using the powerful numpy and pandas lib…

pandas之cut

cut( )用来把一组数据分割成离散的区间。 cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise) # x:被切分的数据,必须是一维的 # bins:①int型整数:将x按照数值大小平均分成分…

为Tueri.io构建React图像优化组件

Let’s face it, image optimization is hard. We want to make it effortless.面对现实吧,图像优化非常困难。 我们希望毫不费力。 When we set out to build our React Component there were a few problems we wanted to solve:当我们开始构建React组件时&#…

红黑树分析

红黑树的性质: 性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。性质3:每个叶子节点(NIL)是黑色。性质4:每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相…

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理。 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ping bbox1: 可见 overlay 网络中的容器可以直接通信,同时 docke…

第 132 章 Example

这里介绍一个负载均衡放置问题,我们可以把它摆放在任何位置,每种方案都各有优缺点,需要根据你的实际情况选择使用 适用于HAProxy / Nginx / LVS 等等 这里用web,db为例子,讲述负载均衡之间的关系 132.1. 双负载均衡的用法 User --…

Python:实现图片裁剪的两种方式——Pillow和OpenCV

原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原…

第一个应在JavaScript数组的最后

by Thomas Barrasso由Thomas Barrasso 第一个应在JavaScript数组的最后 (The first shall be last with JavaScript arrays) So the last shall be [0], and the first [length — 1].所以最后一个应该是[0] ,第一个[length_1]。 – Adapted from Matthew 20:16–根…

鼠标移动到ul图片会摆动_我们可以从摆动时序分析中学到的三件事

鼠标移动到ul图片会摆动An opportunity for a new kind of analysis of Major League Baseball data may be upon us soon. Here’s how we can prepare.不久之后,我们将有机会对美国职棒大联盟数据进行新的分析。 这是我们准备的方法。 It is tempting to think t…

leetcode 1052. 爱生气的书店老板(滑动窗口)

今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。 在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气&#xf…

回到网易后开源APM技术选型与实战

篇幅一:APM基础篇\\1、什么是APM?\\APM,全称:Application Performance Management ,目前市面的系统基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)来做的,翻译传送门《google的Dappe…