CyclicBarrier的用法及实例

CyclicBarrier根据官方文档的说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待;

用人的话来说就是:一组线程在并发的执行过程中,设置一个公共点,只有当每个线程都达到这个公共点的时候,所有的线程才会抢占cpu资源继续运行,否则到达公共点的线程都必须得等待;

构造方法:

 

 

 

CyclicBarrier(int parties) parties设置到达屏障点线程的数量,只有到达parties,才会继续执行,否则await()
CyclicBarrier(int parties, Runnable barrierAction) 可以继承一个runable接口里面写入子任务,给最后一个到达的线程执行

 

 

 

 

 

 intawait() 
          在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
 intawait(long timeout, TimeUnit unit) 
          在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。
intgetNumberWaiting() 
          返回当前在屏障处等待的参与者数目。
intgetParties() 
          返回要求启动此 barrier 的参与者数目。
booleanisBroken() 
          查询此屏障是否处于损坏状态。
voidreset() 
          将屏障重置为其初始状态。

 

 

 

 

 

 

 

 

 

 

 

接下里用一个实例来介绍一波barrier用法:

开学了,有多个同学来学校交作业,只有当老师喊一声交作业了,所有同学才能开始交作业,运用多线程来模拟此过程

package 多线程;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class cyclicbarrier用法 {
	/*
	 * 该用法就是在多个线程同步执行的时候设置一个屏障点,每个线程到达那个屏障点的时候都需要等待
	 * 等到所有人都到达屏障点的时候才执行屏障点所指定的任务
	 * 最后再执行每个任务还没有执行完成的剩下的任务
	 * 该屏障点就是cyclicbarrier对象,每个任务执行到该对象执行的await()方法都停下来,直到达到设置的屏障点的数目,再往后执行
	 */
	public void meeting(CyclicBarrier barrier){
		System.out.println(Thread.currentThread().getName()+"我们来学校了");
		try {
			Thread.sleep(1000);
			barrier.await();//等待其他人一起交作业
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"交了作业");
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		final CyclicBarrier barrier=new CyclicBarrier(5, new Runnable() {
			
			@Override
			public void run() {
				// TODO 自动生成的方法存根
				System.out.println("大家准备开始交作业");
			}
		});
		final cyclicbarrier用法 m=new cyclicbarrier用法();
		for (int i = 0; i < 5; i++) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO 自动生成的方法存根
					m.meeting(barrier);
				}
			}).start();
		}
	}
}

 

 最终的结果是

喜欢的记得点个关注哟!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值