CountDownLatch和CyclicBarrier使用上的区别
一、CountDownLatchDemo
package com.duchong.concurrent;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
/*
* CountDownLatch :阻塞主线程,等子线程完成
*/
public class CountDownLatchDemo {
/**
* 存放子线程产生的结果
*/
private static ConcurrentHashMap<String,Integer> resultMap =new ConcurrentHashMap<>();
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(5);
SubThread subThread = new SubThread(latch);
for (int i = 0; i <=4; i++) {
new Thread(subThread).start();
}
try {
//阻塞主线程
latch.await();
}
catch (InterruptedException e) {
}
//计算总结果
int sum=0;
for(Map.Entry<String,Integer> subNumber:resultMap.entrySet()){
sum +=subNumber.getValue();
}
System.out.println("sum = "+sum);
}
/**
* 子线程
*/
static class SubThread implements Runnable {
private CountDownLatch latch;
public SubThread(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
try {
int number = RandomUtil.getNumber();
System.out.println(name+"---number:"+number);
resultMap.put(name,number);
}
finally {
latch.countDown();
}
}
}
}

二、CyclicBarrierDemo
package com.duchong.concurrent;
import java.util.Map;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CyclicBarrier;
/*
* CyclicBarrier :阻塞子线程,当等待中的子线程数到达一定数量时,跳闸。
*/
public class CyclicBarrierDemo {
/**
* 屏障,初始5 当await()的线程数量达到5时,跳闸。
*/
static CyclicBarrier c = new CyclicBarrier(5,new SumThread());
/**
* 存放子线程产生的结果
*/
private static ConcurrentHashMap<String,Integer> resultMap =new ConcurrentHashMap<>();
public static void main(String[] args) {
//模拟四个子线产生随机数值
for(int i=0;i<=4;i++){
new Thread(new SubThread()).start();
}
}
/**
* 所有子线程等待数等于5时,执行
*/
private static class SumThread implements Runnable{
@Override
public void run() {
int result =0;
for(Map.Entry<String,Integer> workResult:resultMap.entrySet()){
result = result+workResult.getValue();
}
System.out.println("result = "+result);
}
}
/**
* 子线程
*/
static class SubThread implements Runnable{
@Override
public void run() {
String name = Thread.currentThread().getName();
int number = RandomUtil.getNumber();
System.out.println(name+"---number:"+number);
resultMap.put(name,number);
try {
//阻塞子线程
c.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}

CountDownLatch和CyclicBarrier使用上的区别的更多相关文章
- CountDownLatch、CyclicBarrier、Semaphore的区别
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就学习一下这三个辅助类的用法. 以下是 ...
- Java的CountDownLatch和CyclicBarrier的理解和区别
CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...
- CountDownLatch与CyclicBarrier的使用与区别
CountDownLatch的介绍和使用: 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 co ...
- java 并发包JUC下的CountDownLatch和CyclicBarrier的理解和区别
推荐这篇帖子,讲得不错~ https://blog.csdn.net/liangyihuai/article/details/83106584
- java高并发之CountDownLatch,CyclicBarrier和join
晚上打车回家,在车上看到一篇文章<22岁大学生获谷歌天价Offer,年薪千万!>,讲的是印度一个22岁大学生多次参加ACM大赛,开源多个项目,以非常牛逼的履历通过了谷歌的AI测试,斩获谷歌 ...
- CountDownLatch和CyclicBarrier的区别
[CountDownLatch.CyclicBarrier和Semaphore]http://www.cnblogs.com/dolphin0520/p/3920397.html [CountDo ...
- CountDownLatch和CyclicBarrier区别及用法的demo
javadoc里面的描述是这样的. CountDownLatch: A synchronization aid that allows one or more threads to wait unti ...
- JUC之CountDownLatch和CyclicBarrier的区别 (转)
CountDownLatch和CyclicBarrier的功能看起来很相似,不易区分,有一种谜之的神秘.本文将通过通俗的例子并结合代码讲解两者的使用方法和区别. CountDownLatch和Cycl ...
- CountDownLatch和CyclicBarrier的区别(转)
在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用.那如 ...
随机推荐
- ES code study
pom.xml <?xml version="1.0" encoding="UTF-8"?><project xmlns="http ...
- TFRecord 使用
tfrecord生成 import os import xmltodict import tensorflow as tf import numpy as np dir_path = 'F:\数据存储 ...
- Java Web之Servlet及Cookie/Session
Servlet参考文献: 1.http://www.cnblogs.com/luoxn28/p/5460073.html 2.http://www.cnblogs.com/xdp-gacl/p/376 ...
- The puzzle
The puzzle: 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6489 找大佬讲了一下这道题,但还是不懂为什么要这样做,先记录一下以后再研究研究; ...
- 无法将“Scaffold-DbContext”项识别为 cmdlet、函数、脚本文件或可运行程序的名称...
原文链接:https://my.oschina.net/taadis/blog/889560 为什么80%的码农都做不了架构师?>>> PM> Scaffold-DbC ...
- MongoDB允许其它IP地址访问
网址:https://blog.csdn.net/sl1992/article/details/83964310 文章目录1.允许所有地址访问2.绑定内网IP3.绑定多个IP Linux服务器上安装M ...
- iview3 版本 升级
Button 废弃 type ghost,原先的 default 样式有改变. Icon 的图标升级至 ionicons 3.0 图标,图标名称有改变. Breadcrumb 废弃 href 属性. ...
- 解决无法将java项目部署到tomcat中去
project facets java转成web项目 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个Java工程,将无法在Tomcat中进行部署运行. 方法: 1. ...
- 如何将eclipse项目导入到idea
intellij idea中文资料网上比较少,对于eclipse的项目如何导入intellij idea也没有完整的说明,本人在这里整理下,方便更多人加入到intellij idea的阵容里. 直接上 ...
- graph embedding 之 struc2vec
在现实的网络中,构成网络的每个节点可能在网络中担任着某种角色.比如社交网络中,经常可以看见一些关注量很高的大V.两个大V在网络中的角色可能相同,因为他们都有很高的关注量:而大V与普通人(仅有几个关注) ...