java并发-CyclicBarrier

Java并发CountDownLatch和CyclicBarrier 文章目录一.简介二.CountDownLatch三.CyclicBarrier四.总结 一.简介 CountDownLatch和CyclicBarrier是jdk concurrent包下工具类,提供一种控制并发流程的工具。 二.CountDownLatch 构造类,常用api public CountDownLatch(int count) { }; //参数count为计数值 public void await() throws InterruptedException { }; //调用awa 阅读详情

### 1. 简介

CyclicBarrier是一个Java并发工具类,它可以让一组线程在到达某个屏障时停止执行,直到所有线程都到达屏障时才能继续执行。与CountDownLatch类似,CyclicBarrier也可以用来协调多个线程间的执行顺序,但是它的用途更加复杂,可以进行多次等待。CyclicBarrier在处理一些复杂的并发任务时非常有用。

### 2. 底层实现

CyclicBarrier通过java.util.concurrent.locks.ReentrantLock和java.util.concurrent.locks.Condition(一个条件变量)来实现。当一个线程调用await()方法时,它将会被挂起并等待屏障的其它线程到达。当所有线程都到达屏障时,屏障被放开,所有线程都可以继续执行,达到了协调的目的。

CyclicBarrier的内部状态主要由两个变量组成:一个是“参与者数目”,表示需要等待的线程数,另一个是“屏障状态”,表示屏障是否已经被打破。在屏障状态为false时,所有调用await()方法的线程都被挂起。当所有线程都到达屏障,屏障状态变为true,线程们被唤醒,执行继续。

### 3. 应用场景

CyclicBarrier可以被用来解决很多复杂的并发场景。下面我们列举一些应用场景:

1. 数据分块:当我们需要并行处理一段很大的数据时,可以把它分成多个小块,让每一个线程处理一块,等所有线程都完成后,再把它们组合起来。这个时候就可以使用CyclicBarrier来让所有线程在每个小块处理完成后等待,直到所有小块都被处理完成,再计算结果。

2. 游戏网络编程:对于大型多人在线游戏,服务器需要等待所有客户端连接到服务器后,才能开始游戏。这个时候就可以使用CyclicBarrier来让所有客户端在连接完成后等待,直到所有客户端都连接完成,再开始游戏。

3. 循环计算:如果需要多次重复计算一个任务,可以使用CyclicBarrier来让所有线程在每次计算完成后等待,直到所有线程都完成一次计算,再开始下一次计算。

### 4. 示例代码

下面是一个使用CyclicBarrier的示例代码,它演示了如何使用CyclicBarrier对一个大数组进行并行计算:

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

public class BarrierDemo {

    private static final int THREADS = 4;
    private static final int ARRAY_SIZE = 4000000;
    private static final int SEED = 123;

    public static void main(String[] args) {

        int[] array = new int[ARRAY_SIZE];
        Random random = new Random(SEED);
        for (int i = 0; i < ARRAY_SIZE; i++) {
            array[i] = random.nextInt(100);
        }

        CyclicBarrier barrier = new CyclicBarrier(THREADS, () -> {
            System.out.println("计算结果:" + getSum(array));
        });

        for (int i = 0; i < THREADS; i++) {
            new Thread(() -> {
                int startIndex = (ARRAY_SIZE / THREADS) * i;
                int endIndex = (ARRAY_SIZE / THREADS) * (i + 1);
                int sum = getSum(array, startIndex, endIndex);
                System.out.println(Thread.currentThread().getName() + " 计算结果:" + sum);
                try {
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    private static int getSum(int[] array) {
        return getSum(array, 0, array.length);
    }

    private static int getSum(int[] array, int startIndex, int endIndex) {
        int sum = 0;
        for (int i = startIndex; i < endIndex; i++) {
            sum += array[i];
        }
        return sum;
    }
}
```

以上代码会将一个大数组分为4小块,分配给4个线程同时进行计算,等所有线程都完成计算后再将最终结果打印出来。

总结:
- CyclicBarrier是Java并发工具之一,能够让一组线程在到达某个屏障时停止执行,直到所有线程都到达屏障时才能继续执行。
- CyclicBarrier主要通过java.util.concurrent.locks.ReentrantLock和java.util.concurrent.locks.Condition来实现,内部状态由“参与者数目”和“屏障状态”组成。
- CyclicBarrier可以用于数据分块、游戏网络编程、循环计算等复杂并发场景。
- 在编写示例代码时,我们针对一个大数组进行了并行计算的演示。

Java并发工具类--CyclicBarrier详解 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。 举例 举个例子来说明CyclicBarrier的使用: 比如吃鸡游戏4排,需要等4个队友均点击准备才可以开启比赛。 public class CyclicBarrierTest { static class Player implements Runnable{ private String id; 阅读详情

相关推荐

Java并发中的CyclicBarrier

目录 1. 概述 2. 主要方法 2.1 构造函数 2.2 await()方法 3. 使用案例 3.1 分组等待(线程之间相互等待,再一起出发)场景 3.2 超时等待 3.3 回调,使用new CyclicBarrier(parties, Runnable)构造函数 4. CyclicBarrier和CountDownLatch的区别 5. 参考链接 1. 概述 CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barries),它的作用是让一组线程到达一.

litlit023的专栏 305

Java高并发之CyclicBarrier简介

CyclicBarrier 是一种非常有用的同步工具,它可以让多个线程在一个屏障点处等待,直到所有线程都到达该点后,才能继续执行。CyclicBarrier 可以用于协调多个线程的执行,以便它们可以在某个点上同步执行。CyclicBarrier 还支持可重用、回调函数和额外操作等高级用法,可以满足各种同步需求。

xindoo 623

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 426

深入浅出java 下载_深入浅出java CyclicBarrier

简书 占小狼转载请注明原创出处,谢谢!前言JDK的并发包中提供了几个非常有用的工具类,这些工具类给我们在业务开发过程中提供了一种并发流程控制的手段,本文会基于实际应用场景介绍如何使用CyclicBarrier,以及内部实现机制。CyclicBarrier是什么CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线...

weixin_36238073的博客 188

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4592

王爽《汇编语言》课程设计2(不涉及软盘版本)

assume cs:code,ds:data,ss:stack stack segment db 128 dup (0) stack ends data segment db 256 dup (0) data ends code segment start: mov ax,stack mov ss,ax mov sp,128 ...

weixin_41944412的博客 1178

Java并发 JUC工具类:CyclicBarrier详解

对于CountDownLatch,其他线程为游戏玩家,比如英雄联盟,主线程为控制游戏开始的线程。在所有的玩家都准备好之前,主线程是处于等待状态的,也就是游戏不能开始。当所有的玩家准备好之后,下一步的动作实施者为主线程,即开始游戏。对于CyclicBarrier,假设有一家公司要全体员工进行团建活动,活动内容为翻越三个障碍物,每一个人翻越障碍物所用的时间是不一样的。但是公司要求所有人在翻越当前障碍物之后再开始翻越下一个障碍物,也就是所有人翻越第一个障碍物之后,才开始翻越第二个,以此类推。

weixin_45773632的博客 1475

【Apollo规划模块探秘】—— 场景(Scenario)驱动的决策引擎

本文深入解析了Apollo自动驾驶平台规划模块的核心机制——场景(Scenario)驱动的决策引擎。文章通过类比日常驾驶,阐述了规划模块如何像经验丰富的司机一样,根据不同的路况(如车道跟随、无保护左转)切换不同的“驾驶模式”。重点剖析了场景管理器(ScenarioManager)如何基于感知信息进行场景判断与切换,以及“场景-阶段-任务”双层状态机如何精密协作,实现灵活、高效且安全的轨迹规划。

rnn9storyteller的博客 278

【JAVA并发】CyclicBarrier

CyclicBarrier 从字面意思上可以翻译成循环栅栏,或者循环屏障。设立一个屏障,让一组线程都等待完成后(或都到达同一状态后),再继续下一步行动。

原名:@程序员大禹 295

使用mmdetection快速复现计算机视觉顶会论文

使用mmdetection中支持的算法运行自定义数据集

m0_56896669的博客 2420

云服务器安装ros教程

要在 CentOS 7 系统上安装 RouterOS,您需要将 RouterOS 安装为虚拟机或直接安装到物理硬盘上。这里提供的是将 RouterOS 安装到物理硬盘上的步骤,这将完全替换现有的 CentOS 7 系统。请确保您已经备份了所有重要数据。

qq_37662563的博客 2145

Java 多线程高并发 3.7 — CyclicBarrier(循环栅栏)简单使用

如果有了解过 CountDownLatch 的话,这个应该不难理解,相当于 CountDownLatch 的升级版,使得栅栏可重复使用,下面讲讲大概意思和用法 内部有一个计数器,用于记录剩下还没就绪的线程数量 内部使用的是 ReentrantLock ,相当于对 ReentrantLock 作了封装 主要的 api 只有 await() 这个方法,调用这个方法时,CyclicBarrier 中的...

锄禾日当午,啥都不靠谱;闲来没事做,不如写博客。 779

MT4量化交易入门:手把手教你用MQL4编写第一个外汇EA(含完整代码)

本文详细介绍了如何使用MQL4在MT4平台上编写第一个外汇EA,涵盖从开发环境配置到均线交叉策略实现的完整流程。通过手把手教学和完整代码示例,帮助量化交易新手快速掌握外汇自动化交易的核心技术,实现高效的MT4量化交易系统。

mmm90的博客 526

【Java并发】辅助类CountDownLatch、CyclicBarrier、Semaphore

本文总结了JUC常用三大辅助类CountDownLatch、CyclicBarrier、Semaphore的使用方法(含示例代码和方法解析)。

hrh的博客 3224

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

Robot_PLC_HMI_Automation 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java并发工具之CyclicBarrier

一、简介 摘自《Java并发编程的艺术》一书中 CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,

weixin_41951205的博客 2338

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【转】-Java并发之CyclicBarrier

但是其他运动员都领会的裁判正确的指令,剩余的运动员在起跑线上无限地等待下去,并且裁判看到运动员没有到齐,也不会打发令枪。屏障是多线程各自做自己的工作,如果某一线程完成了工作,就等待在屏障那里,直到其他线程的工作都完成了,再一起做别的事。运动员在赛跑的时候都会准备一段时间,当裁判发现所有的运动员都准备完毕的时候,就举起发令枪,比赛开始。相反,它跟条件变量一样,是用来协同多线程一起工作的。,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入。

booleandev 871

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java并发之CyclicBarrier

Java并发之CyclicBarrier一、CyclicBarrier简介二、让线程在CyclicBarrier中等待三、Barrier被破坏3.1 如果有线程已经处于等待状态,调用reset方法会导致已经在等待的线程出现BrokenBarrierException异常。并且由于出现了BrokenBarrierException,将会导致始终无法等待。3.2 如果在等待的过程中,线程被中断,也会抛...

爱是与世界平行 702

Java并发编程CyclicBarrier

一、CyclicBarrier循环栅栏 CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,所有被屏障拦截的线程才会继续执行。 CyclicBarrier循环栅栏和CountDownLatch很类似,都能阻塞一组线程 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须

muli525的博客 503

cyclicbarrier java_Java并发实例之CyclicBarrier的使用

最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正。CyclicBarrier是一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier的介绍CyclicBarrier 的字面意思是可循环(Cyc...

weixin_33321522的博客 212

Java并发– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中在java.util.Concurrent包上引入的同步器,以及其他并发实用程序(例如Counting Semaphore , BlockingQueue , ConcurrentHashMap等)。CyclicBarrier与CountDownLatch类似,我们在上一篇文章中看到过,它允许多个线程等待彼此(障碍),然后继续。 Coun...

最佳 Java 编程 248

深入理解Java并发工具包中的CyclicBarrier

CyclicBarrier的字面意思是“可循环使用的屏障”。它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点(或称为同步点)。在这个屏障点上,线程会被阻塞,直到所有参与的线程都到达这个点。一旦所有线程都到达屏障点,屏障就会被打开,允许所有线程继续执行。这个“循环”的概念意味着,一旦所有线程通过屏障,屏障就会自动重置,可以再次用于下一轮的线程同步。这使得CyclicBarrier非常适合于那些需要多次同步的场景。是Java并发包中提供的一个强大且灵活的同步工具类。

码到三十五 1万+

java并发编程之CountDownLatch与CyclicBarrier

CountDownLatch和CyclicBarrier是jdk concurrent包下非常有用的两个并发工具类,它们提供了一种控制并发流程的手段。本文将会提供一些应用场景,结合源码,对它们的具体实现以及如何使用做一个具体分析。CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch使用案例需求:解析一个文件下多个txt文件数据,

u010185262的博客 6285
上一篇: java并发-Condition
下一篇: java并发-CountDownLatch
曲终--人散
博客等级 码龄14年 23粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值