学习CountDownLatch
对比 使用CyclicBarrier
上次用Barrier方式实现了线程等待一组完成,这次用CountDownLatch来实现
我的理解CountDownLatch 采用的方式是计数器方式,每执行完一个线程,计数器减一,等计数器减到0的时候,之前等待的线程就可以执行了。
和Barrier的例子一样,这次是2个线程等待一组完成,代码如下:
package countdown; import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Demo {
public static void main(String[] args) {
List<String> students = Arrays.asList("Tom","Bill","Dick","Marry","Lily","Harry");
StudentCalc calc = new StudentCalc();
CountDownLatch cdl= new CountDownLatch(students.size());//算是个计数器吧
ExecutorService exec = Executors.newCachedThreadPool();//用线程池方式执行
exec.execute(new TotalScore(cdl,new StudentCalc("语文")));//汇总任务
exec.execute(new TotalScore(cdl,new StudentCalc("英语")));//汇总任务
students.forEach(x->exec.execute(new StudentScore(cdl,calc,x)));//每个学生的任务
exec.shutdown();//关闭线程池
}
} class StudentScore implements Runnable{ private StudentCalc studentCalc;
private String studentName;
private CountDownLatch countDownLatch; public StudentScore( CountDownLatch cdl, StudentCalc studentCalc, String studentName) {
this.countDownLatch=cdl;
this.studentCalc = studentCalc;
this.studentName = studentName;
} @Override
public void run() { studentCalc.student(studentName);
countDownLatch.countDown();//计算之后计数器-1 }
} class TotalScore implements Runnable{
private StudentCalc studentCalc;
private CountDownLatch countDownLatch;
TotalScore(CountDownLatch cdl, StudentCalc studentCalc) {
this.studentCalc = studentCalc;
this.countDownLatch = cdl;
} @Override
public void run() {
try {
countDownLatch.await();//先等待所有线程完成
} catch (InterruptedException e) {
e.printStackTrace();
}
studentCalc.total();//总成绩 计算
}
} /**
* 计算类
*/
class StudentCalc {
private String type; public StudentCalc(String type) {
this.type = type;
} public StudentCalc() {
} /**
* 全部成绩计算完成后,调用汇总
*/
public void total(){
System.out.println(type + "全体学生成绩汇总计算");
} /**
* 计算每个学生自己成绩,为了模拟每个学生计算时间不同,使用Thread.sleep区分
* @param student
*/
public void student(String student){
try {
Thread.sleep(new Random().nextInt(2000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("计算" + student + "成绩");
}
}
执行结果如下:
计算Lily成绩
计算Bill成绩
计算Harry成绩
计算Marry成绩
计算Dick成绩
计算Tom成绩
英语全体学生成绩汇总计算
语文全体学生成绩汇总计算
学习CountDownLatch的更多相关文章
- Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习
装了Intellij,就是装了Gradle. 新建一个Gradle项目.然后下面这个页面要勾选上面两项: Use auto-import和Create directories for empty co ...
- [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier
转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...
- CountDownLatch与thread-join()的区别
今天学习CountDownLatch这个类,作用感觉和join很像,然后就百度了一下,看了他们之间的区别.所以在此记录一下. 首先来看一下join,在当前线程中,如果调用某个thread的join方法 ...
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...
- [笔记][Java7并发编程实战手冊]3.4 等待多个并发事件的完毕CountDownLatch倒计数闭锁
[笔记][Java7并发编程实战手冊]系列文件夹 简单介绍 本文学习CountDownLatch 倒计数闭锁. 本人英文不好.靠机器翻译,然后有一段非常形象的描写叙述,让我把它叫为倒计数 用给定的计数 ...
- 多线程编程-- part 7 CountDownLatch
CountDownLatch简介 CountDownLatch是通过“共享锁”实现的.在创建CountDownLatch中时,会传递一个int类型参数count,该参数是“锁计数器”的初始状态,表示该 ...
- 并发——深入分析CountDownLatch的实现原理
一.前言 最近在研究java.util.concurrent包下的一些的常用类,之前写了AQS.ReentrantLock.ArrayBlockingQueue以及LinkedBlockingQu ...
- java高并发编程基础之AQS
引言 曾经有一道比较比较经典的面试题"你能够说说java的并发包下面有哪些常见的类?"大多数人应该都可以说出 CountDownLatch.CyclicBarrier.Sempah ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
随机推荐
- shell脚本整段注释
摘自:http://zhidao.baidu.com/link?url=XmCCZmfluRe6n8TjPRKJTx4GGOUPSGX1VNBm-euqGdpKGpveTESxC0HL90UBNT5n ...
- UIScrollView UIPageViewControlle…
1.UIScorollView 是ios中提供的滑动控件,用来解决当内容区域大于scorollView可视区域时,可以通过滑动的方式查看整个内容区域,UIScorollView 的滑动控件的基类 ...
- Spring获取bean的步骤
1 处理&问题 2 去chache里找 3 处理对象A依赖对象B的问题 4 生成bean 4.1 处理方法注入 ------lookup-method 4.2 如果类实现了Instan ...
- wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果
上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个 两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...
- 【UML 建模】UML入门 之 交互图 -- 时序图 协作图详解
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/17927131 . 动态图概念 : 从静态图中抽取瞬间值 ...
- Unable To Import Or Enter Sale Order - ORA-20001: APP-FND-01564: ORACLE error - 1422 in get_seq_info
In this Document Symptoms Cause Solution APPLIES TO: Oracle Order Management - Version 12.0.4 ...
- zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
1.从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo 2.引入zTree所需的依赖,例如(jQuery ...
- Java常见运算符整理
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/44724267 本文主要介绍Java中常见的运算符,重点介绍 ...
- Android监听自身卸载,弹出用户反馈调查
1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...
- Linux性能监测:监测目的与工具
Linux性能监测:监测目的与工具介绍 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不是说现在优化了,测试了 ...