首页 > 其他分享 >CyclicBarrier

CyclicBarrier

时间:2022-12-19 17:04:03浏览次数:45  
标签:CyclicBarrier Thread barrier Component 线程 main

CyclicBarrier
字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。
因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次
若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

主要方法:

//设置barties(障点对象)、count(等待的线程数)及barrierCommand(Runnable)属性。  
public CountDownLatch(int count) {  };  //参数count为计数值
public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { };  //将count值减1

//当await的数量到达了设定的数量后,首先执行该Runnable对象。  
CyclicBarrier(int,Runnable):  
//通知barrier已完成线程  
await(): //让当前线程处理wait状态

package thread.cyclic;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
* CyclicBarrier类似于CountDownLatch也是个计数器,
* 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,
* 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。
* CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
* CyclicBarrier初始时还可带一个Runnable的参数,
* 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
*/
public class CyclicBarrierTest {

public static class ComponentThread implements Runnable {
CyclicBarrier barrier;// 计数器
int ID; // 组件标识
int[] array; // 数据数组

// 构造方法
public ComponentThread(CyclicBarrier barrier, int[] array, int ID) {
this.barrier = barrier;
this.ID = ID;
this.array = array;
}

public void run() {
try {
array[ID] = new Random().nextInt(100);
System.out.println(Thread.currentThread() + "Component " + ID + " generates: " + array[ID]);
// 在这里等待Barrier处
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread() + "Component " + ID + " sleep...");
barrier.await();
System.out.println(Thread.currentThread() + "Component " + ID + " awaked...");
// 计算数据数组中的当前值和后续值
int result = array[ID] + array[ID + 1];
System.out.println(Thread.currentThread() + "Component " + ID + " result: " + result);
} catch (Exception ex) {
}
}
}

/**
* 测试CyclicBarrier的用法
*/
public static void testCyclicBarrier() {
final int[] array = new int[3];
CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {
// 在所有线程都到达Barrier时执行
public void run() {
System.out.println(Thread.currentThread() + "testCyclicBarrier run...");
array[2] = array[0] + array[1];
}
});

// 启动线程
new Thread(new ComponentThread(barrier, array, 0)).start();
new Thread(new ComponentThread(barrier, array, 1)).start();
}

public static void main(String[] args) {
CyclicBarrierTest.testCyclicBarrier();
}
}

Output:

Thread[Thread-0,5,main]Component 0 generates: 32
Thread[Thread-1,5,main]Component 1 generates: 41
Thread[Thread-1,5,main]Component 1 sleep...
Thread[Thread-0,5,main]Component 0 sleep...
Thread[Thread-0,5,main]testCyclicBarrier run...
Thread[Thread-0,5,main]Component 0 awaked...
Thread[Thread-0,5,main]Component 0 result: 73
Thread[Thread-1,5,main]Component 1 awaked...
Thread[Thread-1,5,main]Component 1 result: 114

or:

Thread[Thread-0,5,main]Component 0 generates: 33
Thread[Thread-1,5,main]Component 1 generates: 50
Thread[Thread-0,5,main]Component 0 sleep...
Thread[Thread-1,5,main]Component 1 sleep...
Thread[Thread-1,5,main]testCyclicBarrier run...
Thread[Thread-0,5,main]Component 0 awaked...
Thread[Thread-0,5,main]Component 0 result: 83
Thread[Thread-1,5,main]Component 1 awaked...
Thread[Thread-1,5,main]Component 1 result: 133

标签:CyclicBarrier,Thread,barrier,Component,线程,main
From: https://blog.51cto.com/u_15147537/5953060

相关文章

  • CountDownLatch和CyclicBarrier 专题
     4、Runnable接口和Callable接口的区别有点深的问题了,也看出一个Java程序员学习知识的广度。Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方......
  • CyclicBarrier循环屏障源码解析(基于jdk11)
    目录CyclicBarrier循环屏障源码解析(基于jdk11)1.1CyclicBarrier概述1.2CyclicBarrier原理1.2.1基本结构(jdk11)1.2.2await()方法1.2.3dowait方法1.2.3.1breakBarrie......
  • 【JUC】循环屏障CyclicBarrier详解
    欢迎关注专栏【JAVA并发】前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jdk还有一个功能类......
  • CyclicBarrier适用场景
    1、CyclicBarrier无法阻塞主线程,不适合在需要同步返回的接口中使用。CountDownLatch可以阻塞主线程,适用于需要同步返回的接口2、CyclicBarrier适用于异步任务,尤其需要对子......
  • CyclicBarrier并发工具类
    作用让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开放,所有被屏障拦截的线程才会继续运行。核心方法CyclicBarrier(intparties):默认构......
  • CyclicBarrier和CountDownLatch的区别
    CountDownLatch是两组线程,第一组负责计数器减一,第二组是阻塞线程,当第一组线程将计数器减到0时,第二组线程才开始执行,放行是由第三方控制;CyclicBarrier是只有一组线程,只有当所......
  • CyclicBarrier、CountDownLatch、Semaphore的用法
    CyclicBarrier、CountDownLatch、Semaphore的用法CountDownLatch(线程计数器)CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有......
  • CyclicBarrier
    1.介绍​它可以实现​​线程间​​的计数等待,并且可以循环计数。每凑齐一批后又可以继续重新计数。2.构造函数publicCyclicBarrier(intparties);publicCyclicBarrier(......
  • 第二季:6CountDownLatch/CyclicBarrier/Semaphore使用过吗?【Java面试题】
    第二季:6CountDownLatch/CyclicBarrier/Semaphore使用过吗?【Java面试题】​​前言​​​​推荐​​​​6CountDownLatch/CyclicBarrier/Semaphore使用过吗?​​​​说明​​......
  • CyclicBarrier循环屏障
    1.应用场景CyclicBarrier应用于多个线程必须同时开始2.代码privatestaticCyclicBarriercyclicBarrier=newCyclicBarrier(5);publicstaticvoidmain(S......