Java多线程CyclicBarrier的实现代码

 更新时间:2022年02月17日 14:32:23   作者:胡安民  
CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集,本文通过实例代码介绍下Java多线程CyclicBarrier的相关知识,感兴趣的朋友一起看看吧

介绍

CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。

1.就比如说我们在打王者的时候,十个人必须全部加载到100%,才可以开局。否则只要有一个人没有加载到100%,那这个游戏就不能开始。先加载完成的玩家必须等待最后一个玩家加载成功才可以。

在这里插入图片描述

2.你可以想象长途客车,就算你是第一个上车的人,也要等待车满才可以发车。否则车上所有人都要等待。

3.在百米赛跑里,比赛没开始之前,每个运动员都在赛场上自由活动,有的热身,有的喝水,有的跟教练谈论。比赛快开始时,准备完毕的运动员就预备在起跑线上,如果有个运动员还没准备完(除去特殊情况),他们就一直等,直到运动员都在起跑线上,裁判喊口号后再开始跑。这里的起跑线就是屏障,做完准备工作的运动员都等在起跑线,直到其他运动员也把准备工作做完。

代码介绍

接下来我们看看CyclicBarrier它的构造器

//构造器1
public CyclicBarrier(int parties, Runnable barrierAction) {
  if (parties <= 0) throw new IllegalArgumentException();
  this.parties = parties;
  this.count = parties;
  this.barrierCommand = barrierAction;
}
 
//构造器2
public CyclicBarrier(int parties) {
  this(parties, null);
}

CyclicBarrier有两个构造器,第一个构造器是它的核心构造器

参数1: 在这里你可以指定本局游戏的参与者数量(要拦截的线程数)

参数2: 本局结束时要执行的任务,(也就是所有线程执行完后执行的线程)

CyclicBarrier供了两种等待的方法,分别是定时等待和非定时等待。
参数1 : timeout 时间 , 参数2: 时间单位 TimeUnit.SECONDS (秒)

//非定时等待 (比如指定3个线程 每一个线程调用一次内部count--  当count==0时 释放3个线程 然后count重置为3  )
public int await() throws InterruptedException, BrokenBarrierException {
  try {
    return dowait(false, 0L);
  } catch (TimeoutException toe) {
    throw new Error(toe);
  }
}
 
//定时等待 (就是子一定时间内如果还没有 到时间自动唤醒)
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException {
  return dowait(true, unit.toNanos(timeout));
}

重置屏障
将屏障重置到初始状态。 如果任何一方目前正在barrier处等待,他们将返回一个BrokenBarrierException。 注意,由于其他原因发生破损后复位可能会比较复杂; 线程需要以其他方式重新同步,然后选择一个执行重置。 最好是为以后的使用创建一个新的障碍。

public void reset() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            breakBarrier();   // break the current generation
            nextGeneration(); // start a new generation
        } finally {
            lock.unlock();
        }
    }

案例:王者荣耀游戏加载

public static void main(String[] args) throws InterruptedException {

        //设置这局游戏的唯一id 和人数
        CyclicBarrierUtils.initialize("da1",10,()->{
            System.out.println("10人都加载完毕,进入游戏");
        });
        //开始加载游戏
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            ExecutorUtils.create(()->{
                System.out.println(finalI +":加载完毕,等待其他人....");
                CyclicBarrierUtils.await("da1");
            });
        }
    }

代码经过二次封装,所以看看逻辑就行

如有侵权,请私信联系我

到此这篇关于Java多线程CyclicBarrier的文章就介绍到这了,更多相关Java多线程CyclicBarrier内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用Java将word解析出来(包含格式和图片)

    如何使用Java将word解析出来(包含格式和图片)

    今天遇到一个读取word模板内容的需求,下面这篇文章主要给大家介绍了关于如何使用Java将word解析出来,包含格式和图片,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 聊聊@Autowired注解注入,写接口名字还是实现类的名字

    聊聊@Autowired注解注入,写接口名字还是实现类的名字

    这篇文章主要介绍了聊聊@Autowired注解注入,写接口名字还是实现类的名字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java线程池队列DelayQueue的使用详解

    Java线程池队列DelayQueue的使用详解

    这篇文章主要介绍了Java线程池队列DelayQueue的使用详解,DelayQueue顾名思义,它是个无边界延迟队列,它的底层是基于PriorityBlockingQueue实现的,该队列中的元素都是按照过期时间顺序排序的,队列头部放的是即将过期的元素,需要的朋友可以参考下
    2023-12-12
  • 关于@ResponseBody 默认输出的误区的解答

    关于@ResponseBody 默认输出的误区的解答

    这篇文章主要介绍了关于@ResponseBody 默认输出的误区的解答,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    这篇文章主要介绍了Java基础开发之JDBC操作数据库增删改查,分页查询实例详解,需要的朋友可以参考下
    2020-02-02
  • Java Arrays.asList使用方法解析

    Java Arrays.asList使用方法解析

    这篇文章主要介绍了Java Arrays.asList使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • javabean 中使用@Transient属性处理临时字段

    javabean 中使用@Transient属性处理临时字段

    @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,本文给大家介绍javabean 中临时字段的处理:@Transient,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • Springboot实现图片上传功能的示例代码

    Springboot实现图片上传功能的示例代码

    本篇文章主要介绍了SpringBoot如何实现图片上传功能,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-09-09
  • Eclipse中maven的配置详解

    Eclipse中maven的配置详解

    这篇文章主要介绍了Eclipse中maven的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java程序员编程性能优化必备的34个小技巧(总结)

    Java程序员编程性能优化必备的34个小技巧(总结)

    这篇文章主要介绍了Java程序员编程性能优化必备的34个小技巧(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07

最新评论