CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。
接下来我们看看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");
});
}
}
代码经过二次封装,所以看看逻辑就行
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/122967807
内容来源于网络,如有侵权,请联系作者删除!