首页 > 其他分享 >同步屏障CyclicBarrier

同步屏障CyclicBarrier

时间:2023-01-14 21:38:41浏览次数:42  
标签:执行 同步 17 Thread 屏障 线程 parties CyclicBarrier


CyclicBarrier,根据字面意思理解:循环屏障。屏障的意思:CyclicBarrier可以让一组线程到达某个屏障点时被阻塞,直到最后一个线程到达屏障点时,屏障才会放开,所有被屏障阻塞的线程才开始执行任务;循环:当所有线程被释放后,这个CyclicBarrier可以被重用。
有两个很常用的构造方法:
第一个:
/**
* Creates a new {@code CyclicBarrier} that will trip when the
* given number of parties (threads) are waiting upon it, and
* does not perform a predefined action when the barrier is tripped.
*
* @param parties the number of threads that must invoke {@link #await}
* before the barrier is tripped
* @throws IllegalArgumentException if {@code parties} is less than 1
*/
public CyclicBarrier(int parties) {
this(parties, null);
}
这个会创建一个同步屏障,参数表示屏障拦截的线程数量,这些线程需要调用await()方法告诉CyclicBarrier自己到达了屏障点,然后阻塞住,等待其他线程,直到最后一个线程到达屏障点。
第二个:
/**
* Creates a new {@code CyclicBarrier} that will trip when the
* given number of parties (threads) are waiting upon it, and which
* will execute the given barrier action when the barrier is tripped,
* performed by the last thread entering the barrier.
*
* @param parties the number of threads that must invoke {@link #await}
* before the barrier is tripped
* @param barrierAction the command to execute when the barrier is
* tripped, or {@code null} if there is no action
* @throws IllegalArgumentException if {@code parties} is less than 1
*/
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
这个和上面的方法的区别是,当所有线程释放后,会随机选择一个线程来执行barrierAction。
简单示例:
package com.java4all.mypoint;

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

/**
* Author: yunqing
* Date: 2018/7/23
* Description:
*/
public class MyRunnable implements Runnable{

public CyclicBarrier cyclicBarrier;

@Override
public void run() {
try {
Thread.sleep(20000);
System.out.println("子线程正在执行任务,当前线程为:"+Thread.currentThread().getName()+" 时间:"+ LocalTime.now().toString());
cyclicBarrier.await();
}catch (BrokenBarrierException bbnex){
bbnex.printStackTrace();
}catch (InterruptedException inex){
inex.printStackTrace();
}
}


public CyclicBarrier getCyclicBarrier() {
return cyclicBarrier;
}

public void setCyclicBarrier(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
}
package com.java4all.mypoint;

import java.time.LocalTime;
import java.util.concurrent.CyclicBarrier;

/**
* Author: yunqing
* Date: 2018/7/18
* Description:线程测试
* 测试点:一组线程执行完后再执行某任务
*/
public class ThreadTest {

private static CyclicBarrier cyclicBarrier;

public static void main(String[] args)throws Exception{
System.out.println("主线程正在执行前:"+Thread.currentThread().getName()+" 时间:"+ LocalTime.now().toString());
cyclicBarrier = new CyclicBarrier(10, new Runnable() {
@Override
public void run() {
System.out.println("------子线程都执行完了吧!执行任务A!当前线程为:"+Thread.currentThread().getName()+" 时间:"+ LocalTime.now().toString());
}
});

for(int i = 1;i <= 10;i++){
MyRunnable myRunnable = new MyRunnable();
myRunnable.setCyclicBarrier(cyclicBarrier);
new Thread(myRunnable).start();
}
System.out.println("主线程正在执行后:"+Thread.currentThread().getName()+" 时间:"+ LocalTime.now().toString());
}

}
执行结果为:
主线程正在执行前:main      时间:17:30:47.103
主线程正在执行后:main 时间:17:30:47.105
子线程正在执行任务,当前线程为:Thread-5 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-4 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-6 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-0 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-1 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-2 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-3 时间:17:31:07.105
子线程正在执行任务,当前线程为:Thread-9 时间:17:31:07.106
子线程正在执行任务,当前线程为:Thread-7 时间:17:31:07.106
子线程正在执行任务,当前线程为:Thread-8 时间:17:31:07.106
------子线程都执行完了吧!执行任务A!当前线程为:Thread-4 时间:17:31:07.107


标签:执行,同步,17,Thread,屏障,线程,parties,CyclicBarrier
From: https://blog.51cto.com/u_15936016/6007790

相关文章

  • 3-同步异步复位
    复位的作用是将ASIC芯片强制进入一个确定状态.如果芯片是有多个时钟的系统,那么如何保证不同时钟域的电路能够“同时”复位将会是一个重要的问题.同步复位指复位信号只有......
  • 【Elastic Search】同步数据到ES
    参考:http://baijiahao.baidu.com/s?id=1627072961355268467 ES数据同步方案分析比较 方式1:同步双写(数据写入DB时,同时写ES)优点:逻辑简单缺点:硬编码(写入MYSQ......
  • ES之数据同步
    一、同步调用  缺点:容易造成业务耦合二、异步通知  依赖于MQ的性能三、binlog  缺点:依赖于中间件canal ......
  • Edge同步Google书签
      图一  图二  图三  图四......
  • CloudCanal实战-Oracle数据迁移同步到PostgreSQL
    简述本篇文章主要介绍如何使用CloudCanal构建一条Oracle到PostgreSQL的数据同步链路技术要点缩小的数据库权限要求CloudCanal对Oracle数据库的高权限要求,主要......
  • Linux数据实时同步(sersync+rsync)
    一、Slave服务器配置1.在Slave服务器上安装Rsync[root@slave~]#rpm-ivhrsync-3.1.2-11.el7_9.x86_64.rpm###rpm自行下载2.在Slave服务器上配置rsync[root@slave......
  • datax的使用 把oracle数据库的数据同步到Mysql库
    一、liunx环境 1、系统版本:RedHat4.8.5-362、下载datax,直接安装,解压可以二、数据库及表的准备1、oracle表,目前有3条数据; 2、mysql库建相对应的表及字段 ......
  • m基于OFDM系统,对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析
    1.算法描述        OFDM系统下对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析。OFDM系统中的定时估计和频率频率算法——时频联合估计的SC算法,由Schmidl和Cox......
  • m基于OFDM系统,对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析
    1.算法描述OFDM系统下对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析。OFDM系统中的定时估计和频率频率算法——时频联合估计的SC算法,由Schmidl和Cox提出,是一种基于训......
  • 一个并发编程中线程同步和同步锁的问题
    (一个并发编程中线程同步和同步锁的问题)1.线程安全问题经典问题——银行取钱问题里面的核心问题(1)用户输入账户、密码并判断(2)输入取款金额(3)判断余额与取款金额孰多......