并发编程:线程同步工具:3、CyclicBarrier 在指定状态点同步任务

U-Boot 适配新型号 SPI Nor Flash 实战解析 本文详细解析了U-Boot适配新型号SPI Nor Flash的全过程,从JEDEC ID识别错误入手,深入源码分析Flash信息数据库,结合实际手册参数添加新设备支持。重点介绍了设备树同步和验证调试的关键步骤,并总结了常见问题与解决方案,为嵌入式开发者提供实用参考。 阅读详情

目录

CyclicBarrier简介

案例说明

一、主程序

二、矩阵类

三、结果类

四、搜索的工作线程(主要功能)

五、汇总线程

执行结果

其他说明


CyclicBarrier简介

与CountDownLatch类似,CyclicBarrier类构造器需要提供一个整型N参数,这个参数表示在指定点同步的线程个数。每个线程可以调用CyclicBarrier对象的await()方法进入休眠,当N个线程都调用了await()方法后,表示大家都到达了指定地点,此时CyclicBarrier会唤醒所有调用了await()方法而休眠的线程继续执行下去。(CyclicBarrier类还提供了一个重载的构造方法,它可以额外接收一个Runnable类,当所有所有线程抵达同步点时,Runnable会作为一个独立线程对象进行执行,这种功能可以作为分治法的解决方案)

与CountDownLatch不同的是,设计上有其特殊性(提供了reset()方法,和BrokenBarrierException异常。)

案例说明

下面程序设计实现了,利用CyclicBarrier实现N个线程对现有矩阵进行分别搜索,然后通过独立线程进行汇总搜索结果的功能。

一、主程序

本DEMO实现了,由5个线程去搜索10000*1000的矩阵中,值等于6的个数,5个线程分别把结果存入result中。最后由grouper线程对result进行汇总。

package xyz.jangle.thread.test.n3_4.cyclicbarrier;

import java.util.concurrent.CyclicBarrier;

/**
 * 3.4、CyclicBarrier DEMO 在指定状态点同步任务
 * 
 * 本DEMO实现了,由5个线程去搜索10000*1000的矩阵中,值等于6的个数,5个线程分别把结果存入result中。
 * 最后由grouper线程进行汇总。
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月10日 下午12:27:16
 * 
 */
public class M {

	public static void main(String[] args) {
		final int rows = 10000;
		final int length = 1000;
		// 待查询的号码
		final int searchNumber = 6;
		// 线程数量
		final int participants = 5;
		final int linesParticipant = 2000;

		// 矩阵
		MatrixMock mock = new MatrixMock(rows, length, searchNumber);
		// 结果
		Results results = new Results(rows);
		// 总结线程,在所有线程执行完毕后进行启动
		Grouper grouper = new Grouper(results);
		CyclicBarrier barrier = new CyclicBarrier(participants, grouper);
		Searcher[] searcher = new Searcher[participants];
		// 创建N个搜索线程,分别进行搜索
		for (int i = 0; i < searcher.length; i++) {
			searcher[i]= new Searcher(i*linesParticipant, (i+1)*linesParticipant, mock, results, searchNumber, barrier);
			Thread thread = new Thread(searcher[i]);
			thread.start();
		}
		System.out.println("主程序执行完毕");

	}

}

二、矩阵类

构造一个被搜索的矩阵

package xyz.jangle.thread.test.n3_4.cyclicbarrier;

import java.util.Random;

/**
 * 矩阵类,它将生成0~9的随机数字矩阵,用于被搜索线程检索
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月10日 下午12:29:48
 * 
 */
public class MatrixMock {

	private final int data[][];

	public MatrixMock(int size, int length, int number) {
		int counter = 0;
		data = new int[size][length];
		Random random = new Random();
		for (int i = 0; i < size; i++) {
			for (int j = 0; j < length; j++) {
				data[i][j] = random.nextInt(10);
				if (data[i][j] == number) {
					counter++;
				}
			}
		}
		System.out.println("数字" + number + " ,共计" + counter + "个");

	}

	/**
	 * 获取指定行
	 * 
	 * @param row
	 * @return
	 */
	public int[] getRow(int row) {
		if (row < 0 || row > data.length) {
			return null;
		}
		return data[row];
	}

}

三、结果类

用于存放分治搜索的结果

package xyz.jangle.thread.test.n3_4.cyclicbarrier;
/**
 * 	用于存放每行找到对应number的数量结果(每个搜索线程检索完毕后,将结果写入该对象)
 * 	(辅助类)
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月10日 下午12:44:37
 * 
 */
public class Results {
	
	private final int data[];

	public Results(int size) {
		super();
		this.data = new int[size];
	}
	
	/**
	 *  设置对应行存在对应number的数量
	 * 
	 * @param position	行号
	 * @param value		数量
	 */
	public void setData(int position,int value) {
		data[position] = value;
	}
	
	/**
	 * 返回结果
	 * 
	 * @return
	 */
	public int[] getData() {
		return data;
	}
	

}

四、搜索的工作线程(主要功能)

负责对矩阵进行搜索,然后把搜索结果存入result

package xyz.jangle.thread.test.n3_4.cyclicbarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 	搜索线程(用于从mock矩阵中搜索指定的行区间,将匹配的搜索结果写入results中,然后调用barrier的await方法。)
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月10日 下午1:01:41
 * 
 */
public class Searcher implements Runnable {

	private final int firstRow;
	private final int lastRow;
	private final MatrixMock mock;
	private final Results results;
	private final int number;
	private final CyclicBarrier barrier;

	public Searcher(int firstRow, int lastRow, MatrixMock mock, Results results, int number, CyclicBarrier barrier) {
		super();
		this.firstRow = firstRow;
		this.lastRow = lastRow;
		this.mock = mock;
		this.results = results;
		this.number = number;
		this.barrier = barrier;
	}

	@Override
	public void run() {
		int counter;
		System.out.println(Thread.currentThread().getName() + "开始搜索第" + firstRow + "行到第" + lastRow + "行");
		for (int i = firstRow; i < lastRow; i++) {
			int[] row = mock.getRow(i);
			counter = 0;
			for (int j = 0; j < row.length; j++) {
				if (row[j] == number) {
					counter++;
				}
			}
			results.setData(i, counter);
		}
		System.out.println(Thread.currentThread().getName()+"搜索完毕");
		
		try {
			barrier.await();
		} catch (InterruptedException | BrokenBarrierException e) {
			e.printStackTrace();
		}

	}

}

五、汇总线程

对result结果进行汇总,并生成报告。

package xyz.jangle.thread.test.n3_4.cyclicbarrier;

/**
 * 用于汇总的线程(在N个搜索线程搜索完毕之后执行)
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月10日 下午12:53:57
 * 
 */
public class Grouper implements Runnable {

	private final Results results;

	public Grouper(Results results) {
		super();
		this.results = results;
	}

	@Override
	public void run() {
		int finalResult = 0;
		System.out.println("开始汇总结果");
		int[] data = results.getData();
		for (int i : data) {
			finalResult += i;
		}
		System.out.println("汇总结果,总共搜索出"+finalResult+"个");
	}

}

执行结果

数字6 ,共计1000892个
Thread-1开始搜索第2000行到第4000行
主程序执行完毕
Thread-0开始搜索第0行到第2000行
Thread-2开始搜索第4000行到第6000行
Thread-4开始搜索第8000行到第10000行
Thread-3开始搜索第6000行到第8000行
Thread-2搜索完毕
Thread-1搜索完毕
Thread-3搜索完毕
Thread-4搜索完毕
Thread-0搜索完毕
开始汇总结果
汇总结果,总共搜索出1000892个

其他说明

  • getNumberWaiting()方法获取因调用await()方法而休眠的线程数量

  • getParties()方法获取CyclicBarrier对象同步发任务数

  • reset()重置(所有调用了await()方法进入休眠的线程,会因为这个方法的执行而抛出BrokenBarrierException)

  • isBroken()是否被破坏(若N个线程调用了await()方法进入休眠,其中一个线程因为被中断了,那么该线程会抛出InterruptedException异常,而其他线程会收到BrokenBarrierException异常,此时CyclicBarrier对象进入被破坏的状态,isBroken()返回true。)

 

自动批量安装加载cran, bioconductor和github三个平台的所有的R包 阅读详情

相关推荐

机械工程师如何用Codex实现CAD自动化:从重复劳动到智能设计

在机械设计领域,CAD二次开发长期面临学习门槛高、维护成本大的难题。随着AI编程助手如Codex的出现,通过自然语言生成可执行代码,工程师无需精通编程即可实现图纸批量处理、BOM表自动生成、参数化建模等任务。这种技术将重复性操作自动化,显著提升设计效率,让工程师聚焦于核心创新。应用场景涵盖批量修改图纸属性、跨软件数据流转、自动打印等。本文分享机械工程师利用Codex落地自动化的实战经验与避坑指南。

weixin_32296621的博客 356

使用CyclicBarrier实现线程同步

是Java并发包(java.util.concurrent)中的一种同步辅助工具,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier),然后这些线程才可以继续执行。与CountDownLatch不同的是,CyclicBarrier可以重用,因为它会在所有线程到达屏障点后重置计数器。通过本文的介绍,您应该对CyclicBarrier的基本概念、用法以及在多线程编程中的应用有了清晰的了解。

技术研究中心 351

WPS用户看过来:避开格式错乱坑,用WPS Office完美制作红头文件(2024最新版)

本文详细解析了WPS Office与Word在红头文件制作中的核心差异,提供了2024年最新版的零误差实战指南。从字体处理、页面布局到红头制作关键步骤,帮助用户避开格式错乱坑,确保跨设备显示一致。特别针对WPS用户优化,解决字体丢失、版式错位等常见问题。

weixin_26800111的博客 213

线程同步之CyclicBarrier

我们之前分享了一个同步工具CountDonwLatch,它的作用是当一定线程执行完之后,才执行后面代码 ======相关链接==== 对CountDownLatch感兴趣的同学请点击达拉然传送门 而CyclicBarrier的功能是当指定的所有线程处于同一个状态时,同时执行后序代码,我们看下面的例子 public class CyclicBarrierDemo { public s

米勺-Michelle 343

深入解析Android Thermal框架:从应用层到驱动层的温度管理机制

本文深入解析Android Thermal框架的温度管理机制,从应用层到驱动层详细介绍了温度监测、热状态评估和降温策略执行的全过程。通过分层架构解析和关键组件交互,帮助开发者理解Android设备如何实现高效的温度控制,确保硬件安全并优化性能。

weixin_29303701的博客 256

在Jetson orin NX上安装部署Yolov8

1、环境准备与依赖安装2、安装PyTorch和Torchvision:从NVIDIA官方论坛或开发者下载中心获取与你的JetPack版本兼容的PyTorch wheel文件。例如,对于JetPack 5.1.2,可以安装PyTorch v2.1.0 8。:需要编译安装与PyTorch版本匹配的Torchvision。这里自己编译没有成功,下载了一个现成的可以用torchvision-0.16.2+c6f3977-cp38-cp38-linux_aarch64.whl。

xxxcccvvvbbb的博客 774

【java并发】线程同步工具CyclicBarrier的使用

上一节中总结了Semaphore同步工具的使用,Semaphore主要提供了一个记数信号量,允许最大线程数运行。CyclicBarrier是另一个同步工具,这一节主要来总结一下CyclicBarrier的使用。先看一下官方的对CyclicBarrier的介绍: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的

4480

家庭网络中,路由器和交换机的连接顺序

它的目的是给路由器增加端口,用户访问互联网的速度比情况一要快,常用于办公网络、家庭成员多的场景。光纤入户首先连接的肯定是光猫,而在光猫的后面,是先连接交换机?还是应该接路由器呢?家庭网络中路由器和交换机的先后连接顺序。它目的是让更多的用户访问互联网。常用于一些超大型机房、网吧等。至于路由器和交换机的区别。两者之间很多功能都有兼容。但用户上网速度相对较慢。在技术日益迭代的今天。

m0_74075744的博客 1万+

(三)线程同步工具集_4---在一个约定点同步任务

在一个约定点同步任务(Synchronizing tasks in a

sunyameng_ndsc的专栏 918

binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案优化(一)

摘要:针对ISP参数设置中浮点权重系数需转换为整数的问题,提出整数邻域搜索方案。该方法在浮点最优解附近(±1/±2)进行局部搜索,通过逐阶微调找到误差最小的整数权重组合,避免直接取整导致的误差反弹(误差从0.8%降至0.35%)。方案结合范围约束(1~15)和单调性约束(暗端递减、亮端递增),兼顾计算效率(单图耗时<10ms)与硬件兼容性,显著优于暴力搜索和简单取整,满足工程落地需求。

大熊 94

第三篇:NVIDIA cuOpt Python API 详解:LP、QP、MILP 建模与求解,附核心术语名词解释

NVIDIA cuOpt是一款GPU加速的优化求解库,支持LP、QP、MILP和路径优化问题。本文详细介绍了其Python API使用方法,包括核心类Problem的变量定义、约束添加、目标设置和求解配置,并提供了术语解释。cuOpt通过GPU并行计算大幅提升大规模优化问题的求解效率,支持多种求解算法和参数配置,适用于需要高性能计算的优化场景。安装方式包含pip和Docker两种,验证安装后即可快速开始建模求解。

算法工程师 236

线程同步的四种方式

线程同步

Lce的专栏 2万+

视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)

内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li

大模型大数据攻城狮的专栏 2202

CyclicBarrier线程同步

CyclicBarrier是JDK提供的一个同步工具,它的作用是让一组线程全部达到一个状态之后再全部同时执行。

fumeidonga的博客 1168

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java并发编程JUC:CyclicBarrier线程同步

每个线程通过调用await(),在CyclicBarrier障碍处“彼此等待”,一旦所有的线程都到达了CyclicBarrier(都调用了CyclicBarrier方法),所有的线程将一起再次被唤醒继续执行。1.创建CyclicBarrier障碍当创建CyclicBarrier的时候,需要指定需要控制多少个线程同步。比如下面的CyclicBarrier设置为控制2个线程同步。2. 在CyclicBarrier障碍处等待。

2401_84411879的博客 1071

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java 多线程之 CyclicBarrier(并行任务/数据加载/同步辅助类)

CyclicBarrier(循环屏障)是Java并发编程中的一种同步辅助工具。它允许一组线程相互等待,直到所有线程都到达一个共同的屏障点,然后继续执行后续操作。CyclicBarrier可以用于解决多线程任务的协调和同步问题。CyclicBarrier 的主要作用是使多个线程在某个点上进行同步等待所有线程都到达该点后再一起继续执行。它类似于一组线程从启动开始跑步,跑到3000米时停下等待其他线程,全部跑到3000米后裁判统计分数,然后再同时开始启跑。

QIFU的专栏 1437

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

循环栅栏(CyclicBarrier)是一种同步工具,它允许一组线程互相等待,直到所有线程都达到某个公共屏障点

当 CyclicBarrier 的构造函数被调用时,会创建一个屏障,该屏障在每个屏障点(barrier point)处将一组线程阻塞,直到所有线程都到达该点。这个屏障点也被称为"屏障"或"栅栏",在这一点,所有参与线程都会停下来,直到所有线程都到达这个屏障点。这个方法可以帮助我们更好地了解线程的执行情况,例如当所有的工作线程都到达屏障点后,我们可以使用这个方法来检查是否有任何线程在等待队列中等待。例如,考虑一个需要多个线程协作完成的任务,每个线程在完成自己的一部分工作后都需要等待其他线程完成他们的工作。

[Blog][Domain] programb.blog.youkuaiyun.com 1112

CyclicBarrier —— 可循环利用的线程同步屏障

在多线程编程中,常常需要让一组线程在某个节点上相互等待,待所有线程都到达后再一起继续后续操作。CyclicBarrier(循环栅栏)就是为这种场景设计的同步工具类,它允许一组线程相互等待,直到所有线程都到达屏障点,然后屏障打开,所有线程同时继续执行。线程调用 : 七、与 CountDownLatch 的区别 特性 CyclicBarrier CountDownLatch 是否可复用 是(循环) 否(一次性) 线程职责 全部参与同步等待 一部分倒计时,另一部分等待 实现机制 Cond

IT技术学习与工作笔记分享 1171

线程协作:揭秘同步大法CountDownLatch、Semaphore和CyclicBarrier

线程协作:揭秘同步大法CountDownLatch、Semaphore和CyclicBarrier

一恍过去 1万+

Java 入门指南:Java 并发编程 —— 同步工具类 CyclicBarrier(循环屏障)

CyclicBarrier(循环屏障)是 Java 中的一种同步辅助类,用于控制多个线程在某个屏障点上等待,然后在达到屏障点时一起继续执行。它允许一组线程互相等待,直到所有线程都达到某个公共屏障点(也称为同步点),然后这些线程才会一起继续执行后续的任务。与 CountDownLatch 类似,但可以重复使用。

热带鱼的技术博客 1300

线程同步类:CyclicBarrier

CyclicBarrier:栅栏 构造方法: // 一起执行的线程数 public CyclicBarrier(int parties) // 一起执行的线程数,barrierAction优先开始执行的线程 public CyclicBarrier(int parties, Runnable barrierAction) 主要方法: await方法:让线程进入barrier状态,当进入barri...

jym的博客 1万+

Java:实现使用CyclicBarrier实现线程同步(附带源码)

在本项目中,我们展示了如何使用CyclicBarrier来同步多个线程的执行。CyclicBarrier是一种非常实用的工具,适用于那些需要协调多个线程在同一时刻开始执行任务的场景。通过CyclicBarrier,我们可以确保所有线程在到达某个同步点后,能够一起继续执行后续任务。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 894

【线程同步工具】CyclicBarrier源码分析

count属性和CountDownLatch中的count一样,代表还需要等待的线程数,初始值为parties,每当一个线程到来就减一,如果该值为0,则说明所有的线程都到齐了,大家可以一起通过Barrier了。这个breakBarrier怎么理解呢,继续拿上面过上车的例子打比方,有时候某个时间段,景区的人比较少,等待过山车的人数凑不够10个人,眼看后面迟迟没有人再来,这个时候有的工作人员也会打开栅栏,让正在等待的人进来坐过山车。该方法用于开启新的“一代”,通常是被最后一个调用await方法的线程调用。

weixin_45645846的博客 520

并发编程之 CyclicBarrier 详解

本文深入分析了Java并发工具类CyclicBarrier的实现原理及应用。CyclicBarrier允许线程在特定屏障点同步等待,当所有线程到达后继续执行。文章首先介绍了其基本概念、构造方法和核心API,通过示例展示了其使用方式。随后重点解析了源码实现,包括内部成员变量(ReentrantLock、Condition等)、构造方法和核心await/dowait方法的工作原理。CyclicBarrier通过计数器机制和代(generation)概念实现线程同步,支持超时等待和屏障重置功能。该工具类适用于需要

qq_844085127的博客 844

并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用

本文深入解析Java并发工具CyclicBarrier和Phaser的核心机制与应用场景。CyclicBarrier作为循环屏障,支持多轮线程同步,特别适合分阶段数据处理等固定线程数的协作场景。Phaser则提供动态调整能力,可灵活增减参与者,适用于线程数量变化的多阶段任务,还支持分层同步优化性能。文章通过典型代码案例对比了两者的实现方式,并与CountDownLatch、Semaphore形成完整工具矩阵,为开发者提供明确的选型指南:固定线程用CyclicBarrier,动态线程用Phaser,简单等待用

dom_jun的博客 1179

java并发编程JUC第十篇:CyclicBarrier线程同步

在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、BlockingDeque接口、ConcurrentHashMap、CountDownLatch,本文为系列文章第十篇。 java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障.

字母哥博客 854
上一篇: 并发编程:线程同步工具:2、CountDownLatch 等待N个并发事件(条件)
下一篇: 并发编程:线程同步工具:4、Phaser 运行阶段性并发任务
博风
博客等级 码龄16年 442粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值