首页 > 编程语言 >Java高并发之CyclicBarrier简介(转)

Java高并发之CyclicBarrier简介(转)

时间:2023-07-19 11:23:54浏览次数:42  
标签:Java Thread barrier 并发 屏障 线程 new CyclicBarrier

原文:https://juejin.cn/post/7209617649885184058

作者:xindoo

来源:稀土掘金

  Java 中的 CyclicBarrier 是一种同步工具,它可以让多个线程在一个屏障处等待,直到所有线程都到达该屏障处后,才能继续执行。CyclicBarrier 可以用于协调多个线程的执行,以便它们可以在某个点上同步执行。

  CyclicBarrier 是 Java 中的一种同步工具,它可以让多个线程在一个屏障点处等待,直到所有线程都到达该点后,才能继续执行。CyclicBarrier 可以用于协调多个线程的执行,以便它们可以在某个点上同步执行。

使用方式

CyclicBarrier 的基本用法如下:

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

public class CyclicBarrierExample {

    public static void main(String[] args) {
        int n = 3;
        CyclicBarrier barrier = new CyclicBarrier(n, new Runnable() {
            public void run() {
                System.out.println("All threads have reached the barrier");
            }
        });

        Thread t1 = new Thread(new MyRunnable(barrier), "Thread 1");
        Thread t2 = new Thread(new MyRunnable(barrier), "Thread 2");
        Thread t3 = new Thread(new MyRunnable(barrier), "Thread 3");

        t1.start();
        t2.start();
        t3.start();
    }

    static class MyRunnable implements Runnable {
        private final CyclicBarrier barrier;

        public MyRunnable(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

        public void run() {
            try {
                System.out.println(Thread.currentThread().getName() + " is waiting at the barrier...");
                barrier.await();
                System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

  在这个例子中,我们创建了一个 CyclicBarrier 对象,它需要等待 3 个线程到达屏障点。当所有线程都到达屏障点后,将会触发一个回调函数,打印一条消息。

  我们创建了 3 个线程,并将它们传递给一个自定义的 Runnable 对象。在每个线程的 run 方法中,我们首先打印一条消息,表示线程正在等待屏障点。然后调用 barrier.await() 方法,将线程加入到等待队列中,直到所有线程都到达屏障点后,才会继续执行。在最后,我们打印一条消息,表示线程已经跨过了屏障点。

上面代码的运行结果如下:

Thread 1 is waiting at the barrier...
Thread 3 is waiting at the barrier...
Thread 2 is waiting at the barrier...
All threads have reached the barrier
Thread 2 has crossed the barrier
Thread 1 has crossed the barrier
Thread 3 has crossed the barrier

   从上面代码中也可以看出,CyclicBarrier 还支持一个可选的回调函数,在所有的线程都到达屏障点后,会调起指定的回调函数,上述例子中当所有线程到达屏障点的时候,会执行回调函数,表明已经到达屏障点。

  CyclicBarrier 还支持一个更高级的用法,即可以在等待线程到达屏障点时,执行一些额外的操作。可以通过 await 方法的返回值来实现这一点,如下所示:

int index = barrier.await();
if (index == 0) {
    // 执行额外的操作
}

在这个例子中,await 方法的返回值表示线程在等待队列中的位置,如果返回值为 0,则表示当前线程是最后一个到达屏障点的线程,可以执行一些额外的操作,比如说做一些数据清理之类的收尾工作。

注意事项

在使用 Java 中的 CyclicBarrier 时,需要注意以下几点:

  1. CyclicBarrier 的计数器是可重用的,也就是说,当所有线程都到达屏障点后,计数器会被重置为初始值,可以再次使用。如果在等待过程中出现异常,计数器将会被重置,并且所有等待的线程都将会抛出 BrokenBarrierException 异常。

  2. 如果使用 CyclicBarrier 时,等待的线程数超过了计数器的初始值,将会导致所有线程永远等待下去。因此,在使用 CyclicBarrier 时,需要确保等待的线程数不会超过计数器的初始值。

  3. CyclicBarrier 的回调函数是在最后一个线程到达屏障点时执行的,因此,在回调函数中执行的操作应该是线程安全的,否则可能会导致不可预期的结果。

  4. CyclicBarrier 可以用于协调多个线程的执行,以便它们可以在某个点上同步执行。**但是,如果线程之间的执行顺序对于程序的正确性很重要,那么 CyclicBarrier 可能不是最好的选择。**在这种情况下,可能需要使用其他同步工具,如 CountDownLatch 或 Semaphore。

  5. CyclicBarrier 的性能可能会受到等待线程的数量和计数器的初始值的影响。**如果等待线程的数量很大,或者计数器的初始值很大,那么可能会导致性能下降。**因此,在使用 CyclicBarrier 时,需要根据实际情况进行调整。

  总之,在使用 Java 中的 CyclicBarrier 时,需要仔细考虑各种情况,以确保程序的正确性和性能。


总结

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

 

标签:Java,Thread,barrier,并发,屏障,线程,new,CyclicBarrier
From: https://www.cnblogs.com/ajianbeyourself/p/17565062.html

相关文章

  • JavaScript 的优雅编程技巧:Singleton Pattern
    JavaScript的优雅编程技巧:SingletonPattern定义单例模式:保证一个类仅有一个实例,并提供一个访问的全局访问点。特点仅有一个实例对象全局都可访问该实例主动实例化延迟实例化类似单例模式的使用实践jQuery,lodash,moment....电商中的购物车(因为一个用户只有一......
  • javaSe笔试题
    1 ==和equals区别 ......
  • 【Javascript】数组扩展方法:根据key重新分组
    1//数组扩展:根据key重新分组2//field:按什么字段分组3Array.prototype.GroupByKey=function(field)4{5varoriginalArr=this6lettempArr=[]7letresultData=[]8for(leti=0;i<originalArr.length;i++)9{10......
  • JavaScript 笔记(二)事件循环机制
    一、事件循环机制1.定义:事件循环是JavaScript中一种重要的异步执行机制。2.作用:管理和协调各种异步任务的执行顺序,保证JavaScript代码的执行顺序和预期一致。3.组成部分:3.1主线程(调用栈):执行任务;3.2任务队列:存放异步任务;3.3事件循环......
  • Java的SPI机制实践
    JavaSPI机制概述先给出结论:“Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想”。Java的SPI机制常用于框架扩展或组件替换,最常见的JavaSPI应用就是JDBCDriver,JDK提供了java.sql.Driver接口,却将具体的实现交给了相应的数据库驱动,比如:在mysql-co......
  • Java高并发编程的关键概念和技术,深入理解并成功应对高并发问题
    Java高并发编程的关键概念和技术,深入理解并成功应对高并发问题1.是什么是高并发?高并发指的是系统在同一时间点需要处理大量并发请求的能力。这些请求可能来自多个用户或者多个线程。在高并发环境下,传统的串行处理方式往往无法满足性能需求,因此需要采用并发编程来提高系统的吞吐......
  • Java中的split( )函数
      Java中的split()函数Leaf_Ysm关注IP属地:浙江0.1512018.10.2410:44:46字数252阅读46,821首先,我们来了解一下split()函数各个参数的意义publicString[]split(Stringregex,intlimit)regex--正则表达式分隔符。limit--分割的份数。下面就让我......
  • Go语言的并发
    使用协程这种并发模式是趋势,协程的基本要求是:并发执行和可大量创建。一些语言已经支持协程,下面这个图来自:http://qing.weibo.com/tj/88ca09aa33002ele.html这种并发模式的内核只需要协程和通道就够了。其中协程负责执行代码,通道负责在协程之间传递事件。     协程是轻量级......
  • [Javascript] DOM alias $, $$
    const$=()=>document.querySelector.call(this,arguments);const$$=()=>document.querySelectorAll.call(this,arguments);HTMLElement.prototype.on=(a,b,c)=>this.addEventListener(a,b,c);HTMLElement.prototype.off=(a,b)=>this.......
  • java mongo 插入geometry 多边形 线 点
    importcom.mongodb.client.MongoCollection;importcom.mongodb.client.model.geojson.LineString;importcom.mongodb.client.model.geojson.Point;importcom.mongodb.client.model.geojson.Polygon;importcom.mongodb.client.model.geojson.Position;importcom.tusvn.cc......