Java多线程CyclicBarrier的实现代码

网友投稿 253 2022-08-27


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();http://

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");

});

}

}

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

如有侵权,请私信联系我


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python之插入排序(Python中排序)
下一篇:PythonGUI编程之移动控件
相关文章

 发表评论

暂时没有评论,来抢沙发吧~