`

CyclicBarrie

 
阅读更多

个人学习笔记,如有错误欢迎指正。。

 

 

CyclicBarrier 类用于阻塞一个或多个线程,等待其它线程完成任务,直至所有线程都完成各自的任务,才会解除阻塞继续执行。 

 

 构建器 CyclicBarrier   (int n,Runnable runnable)

 

await()方法被调用时,计数器N减一,如果计数据N>0,则当前线程阻塞,如果计数器N==0时,则 Runnable 被调用, Runnable 执行完成后,所有因为await()方法阻塞的线程被唤醒。N被再次重置为初始值,这个  CyclicBarrier  可以被再次复用。 

 

示例:计算1+2+3+4+5+6+........+10000=??

    由多个线程执行计算,每个线程计算的结果相加就等于最终结果,并每个线程打印出最终结果。

 

public class TestCyclicBarrier implements Runnable{
	CyclicBarrier cyclicBarrier = null;
	int startValue;
	int endValue;
	AtomicLong total ;
	String threadName ; 
	String resultReceiver;
	public TestCyclicBarrier(String threadName,CyclicBarrier cyclicBarrier,AtomicLong total,int startValue,int endValue,String resultReceiver){
		this.cyclicBarrier =  cyclicBarrier;
		this.startValue = startValue;
		this.endValue = endValue;
		this.total = total;
		this.threadName = threadName;
		this.resultReceiver = resultReceiver;
	}
	static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try{
			
			//开始计算
			System.out.println(sdf.format(new Date())+": "+this.threadName+"  count  start:"+startValue+"+"+(startValue+1)+"+"+(startValue+2)+" .....+"+endValue+"=?");
			Thread.sleep(2000);
			
			long total = 0;
			for(int i=startValue;i<endValue;i++){
				total+= i;
			}
			System.out.println(sdf.format(new Date())+": "+this.threadName+"  count finish:"+startValue+"+"+(startValue+1)+"+"+(startValue+2)+" .....+"+endValue+" = "+total);
			this.total.addAndGet(total);//计算完成
			cyclicBarrier.await();//本线程计算工作完成,阻塞等待其它线程完成完成计算
			System.out.println(sdf.format(new Date())+": "+this.threadName+" send result to "+resultReceiver+":"+this.total.get());//所有任务计算完成,将最终结果发送给某人
			System.out.println(sdf.format(new Date())+": "+this.threadName+" to exit");//线程退出
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static void main(String args []){
		final AtomicLong total = new AtomicLong();
		int startValue = 1;
		int endValue = 10000;
		int difference = endValue-startValue;
		int threadNum = difference/1000;//每条线程计算1000个数据相加
		if(difference%100>0){//计算需要线程数
			threadNum++;
		}
		CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum,new Runnable(){
			
			@Override
			public void run() {//把有线程任务执行完成时,调用。
				// TODO Auto-generated method stub
				System.out.println(sdf.format(new Date())+": ALL thread count finish , count result ="+total.get());
			}
			
			
		});
		 ExecutorService executorService=Executors.newCachedThreadPool();
		for(int i=0;i<threadNum;i++){//任务拆分,发给多个线程执行
			int startValueForThread = startValue+(i*1000);
			int endValueForThread = startValue+(i*1000)+1000;
			if(endValueForThread>endValue){
				endValueForThread= endValue;
			}
			TestCyclicBarrier testCyclicBarrier = new TestCyclicBarrier("thread_"+i,cyclicBarrier,total,startValueForThread,endValueForThread,"person"+i);
			executorService.execute(testCyclicBarrier);//开始执行任务线程
			
		}
		
	}
}

 程序输出:

2013-12-01 22:46:02: thread_1  count  start:1001+1002+1003 .....+2001=?

2013-12-01 22:46:02: thread_0  count  start:1+2+3 .....+1001=?

2013-12-01 22:46:02: thread_2  count  start:2001+2002+2003 .....+3001=?

2013-12-01 22:46:02: thread_3  count  start:3001+3002+3003 .....+4001=?

2013-12-01 22:46:02: thread_4  count  start:4001+4002+4003 .....+5001=?

2013-12-01 22:46:02: thread_6  count  start:6001+6002+6003 .....+7001=?

2013-12-01 22:46:02: thread_5  count  start:5001+5002+5003 .....+6001=?

2013-12-01 22:46:02: thread_7  count  start:7001+7002+7003 .....+8001=?

2013-12-01 22:46:02: thread_9  count  start:9001+9002+9003 .....+10000=?

2013-12-01 22:46:02: thread_8  count  start:8001+8002+8003 .....+9001=?

2013-12-01 22:46:04: thread_1  count finish:1001+1002+1003 .....+2001 = 1500500

2013-12-01 22:46:04: thread_0  count finish:1+2+3 .....+1001 = 500500

2013-12-01 22:46:04: thread_2  count finish:2001+2002+2003 .....+3001 = 2500500

2013-12-01 22:46:04: thread_3  count finish:3001+3002+3003 .....+4001 = 3500500

2013-12-01 22:46:04: thread_4  count finish:4001+4002+4003 .....+5001 = 4500500

2013-12-01 22:46:04: thread_5  count finish:5001+5002+5003 .....+6001 = 5500500

2013-12-01 22:46:04: thread_6  count finish:6001+6002+6003 .....+7001 = 6500500

2013-12-01 22:46:04: thread_7  count finish:7001+7002+7003 .....+8001 = 7500500

2013-12-01 22:46:04: thread_9  count finish:9001+9002+9003 .....+10000 = 9490500

2013-12-01 22:46:04: thread_8  count finish:8001+8002+8003 .....+9001 = 8500500

2013-12-01 22:46:04: ALL thread count finish , count result =49995000

2013-12-01 22:46:04: thread_8 send result to person8:49995000

2013-12-01 22:46:04: thread_8 to exit

2013-12-01 22:46:04: thread_1 send result to person1:49995000

2013-12-01 22:46:04: thread_1 to exit

2013-12-01 22:46:04: thread_2 send result to person2:49995000

2013-12-01 22:46:04: thread_2 to exit

2013-12-01 22:46:04: thread_3 send result to person3:49995000

2013-12-01 22:46:04: thread_3 to exit

2013-12-01 22:46:04: thread_5 send result to person5:49995000

2013-12-01 22:46:04: thread_6 send result to person6:49995000

2013-12-01 22:46:04: thread_9 send result to person9:49995000

2013-12-01 22:46:04: thread_0 send result to person0:49995000

2013-12-01 22:46:04: thread_9 to exit

2013-12-01 22:46:04: thread_6 to exit

2013-12-01 22:46:04: thread_5 to exit

2013-12-01 22:46:04: thread_4 send result to person4:49995000

2013-12-01 22:46:04: thread_4 to exit

2013-12-01 22:46:04: thread_7 send result to person7:49995000

2013-12-01 22:46:04: thread_0 to exit

2013-12-01 22:46:04: thread_7 to exit

 

 

 

分享到:
评论

相关推荐

    6.4 深入理解 AQS 之 CyclicBarrie 详解副本.mp4

    6.4 深入理解 AQS 之 CyclicBarrie 详解副本.mp4

    6.4 深入理解 AQS 之 CyclicBarrie 详解副本副本.mp4

    6.4 深入理解 AQS 之 CyclicBarrie 详解副本副本.mp4

    AQS原理及常用功能思维导图

    AQS特性,以及源码流程,常见应用Semaphorer&CountDownLatch&CyclicBarrie

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    基于新型战争策略优化算法的光伏模型优化 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    perl-Locale-Maketext-1.23-3.el7.x64-86.rpm.tar.gz

    1、文件内容:perl-Locale-Maketext-1.23-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-Locale-Maketext-1.23-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    学业帮扶管理系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程.zip

    免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx

    pcre2-utf16-10.23-2.el7.x64-86.rpm.tar.gz

    1、文件内容:pcre2-utf16-10.23-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pcre2-utf16-10.23-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    Java毕业设计-springboot-vue-果树生长系统(源码+sql脚本+29页零基础部署图文详解+39页论文+27页参考答辩+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    爱心小屋公益机构智慧管理系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程.zip

    免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx

    Java毕业设计-springboot-vue-PS5游戏服务网站(源码+sql脚本+29页零基础部署图文详解+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    威圣DA100电脑调音软件

    电脑调音软件下载是专为汽车音响爱好者和专业人士设计的一款强大工具, 这款软件的主要功能在于帮助用户对车载音频系统进行精确的数字信号处理,以提升音乐播放效果,提供更丰富的听觉体验。

    perl-IO-Compress-2.061-2.el7.x64-86.rpm.tar.gz

    1、文件内容:perl-IO-Compress-2.061-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-IO-Compress-2.061-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    MATLAB仿真实验:电动汽车有序充放电的机组组合与最优潮流算法研究-基于MILP与二阶锥松弛技术,MATLAB代码:考虑电动汽车有序充放电的机组组合和最优潮流 关键词:电动汽车 MILP 最优潮流

    MATLAB仿真实验:电动汽车有序充放电的机组组合与最优潮流算法研究——基于MILP与二阶锥松弛技术,MATLAB代码:考虑电动汽车有序充放电的机组组合和最优潮流 关键词:电动汽车 MILP 最优潮流 参考文档:《A bi-layer optimization based temporal and spatial scheduling for large-scale electric vehicles》 仿真平台:MATLAB YALMIP GUROBI 主要内容:机组组合采用原文相同的线性化方法 最优潮流采用二阶锥松弛替代原文算法 结果完全相同 ,电动汽车; MILP; 最优潮流; 二阶锥松弛; 线性化方法,基于MILP与二阶锥松弛的电动汽车有序充放电最优潮流仿真研究

    基于麻雀搜索算法优化SVR回归预测模型:以身体脂肪含量数据集的精准预测为研究对象,基于麻雀搜索算法优化SVR回归预测模型 输入不限,单输出 数据选用:身体脂肪含量数据集 针对SVR回归预测模型采用麻雀

    基于麻雀搜索算法优化SVR回归预测模型:以身体脂肪含量数据集的精准预测为研究对象,基于麻雀搜索算法优化SVR回归预测模型 输入不限,单输出 数据选用:身体脂肪含量数据集 针对SVR回归预测模型采用麻雀搜索算法 ,基于麻雀搜索算法; SVR回归预测模型优化; 身体脂肪含量数据集; 算法优化SVR模型,基于麻雀搜索算法优化SVR预测身体脂肪含量模型

    Java毕业设计-springboot-vue-农产品电商平台(源码+sql脚本+29页零基础部署图文详解+41页论文+27页参考答辩+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    janus本地部署资料

    deepseek janus本地部署资料

    perl-Env-1.04-2.el7.x64-86.rpm.tar.gz

    1、文件内容:perl-Env-1.04-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-Env-1.04-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于蒙特卡洛的电动车有序充放电附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于蒙特卡洛模拟法的风光场景生成与削减:深度解析风光出力模型及其实证研究,21-基于蒙特卡洛模拟法的风光场景生成与削减 摘要:代码主要做的是风光场景的生成与削减,首先对风光出力概率分布模型进行建模,分

    基于蒙特卡洛模拟法的风光场景生成与削减:深度解析风光出力模型及其实证研究,21-基于蒙特卡洛模拟法的风光场景生成与削减 摘要:代码主要做的是风光场景的生成与削减,首先对风光出力概率分布模型进行建模,分布以Beta模型以及Weibull分布模型描述光伏和风电出力的形状参数,并继而根据蒙特卡洛法模拟出1000次风光出力场景,最后通过概率距离对场景进行削减,直至生成5个场景。 本代码几乎一行一注释,相关公式我已经整理成文档供参考,绝对是目前最为细致的风光场景生成与削减的学习资料,欢迎来辨注释程度、出图效果可以见下图哦 优质服务:1、代码非常精品,注释几乎一行一注释; 5、本代码不提供本代码不提供 6、代码买前问清楚,一经不 不一经不 不 ,基于蒙特卡洛模拟法的风光场景生成与削减; 风光出力概率分布模型; Beta模型; Weibull分布模型; 蒙特卡洛法模拟; 场景削减; 注释详细的代码; 出图效果。,基于蒙特卡洛模拟法的风光场景生成与削减技术详解

Global site tag (gtag.js) - Google Analytics