java jdk提供的同步器_Java 同步器

CyclicBarrier是什么

CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线程才能继续执行。

CyclicBarrier好比一扇门,默认情况下关闭状态,堵住了线程执行的道路,直到所有线程都就位,门才打开,让所有线程一起通过。

构造方法

默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier已经到达屏障位置,线程被阻塞。

另外一个构造方法CyclicBarrier(int parties, Runnable barrierAction),其中barrierAction任务会在所有线程到达屏障后执行。

2d126a39f2024159e1db9da263042402.png

CyclicBarrier.png

应用场景

想象一个场景,运动会男子100米决赛,8名选手。

Athlete.java :每个运动员都就位后才开始。

class Athlete implements Runnable {

private CyclicBarrier cyclicBarrier;

private String name;

public Athlete(CyclicBarrier cyclicBarrier, String name) {

this.cyclicBarrier = cyclicBarrier;

this.name = name;

}

@Override

public void run() {

System.out.println(name + "就位");

try {

cyclicBarrier.await();

Random random =new Random();

double time = random.nextDouble() + 9;

System.out.println(name + ": "+ time);

} catch (Exception e) {

}

}

}

Race.java : 负责屏障的初始化。

class Race {

private CyclicBarrier cyclicBarrier = new CyclicBarrier(8);

public void start() {

List athleteList = new ArrayList<>();

athleteList.add(new Athlete(cyclicBarrier,"博尔特"));

athleteList.add(new Athlete(cyclicBarrier,"鲍威尔"));

athleteList.add(new Athlete(cyclicBarrier,"盖伊"));

athleteList.add(new Athlete(cyclicBarrier,"布雷克"));

athleteList.add(new Athlete(cyclicBarrier,"加特林"));

athleteList.add(new Athlete(cyclicBarrier,"苏炳添"));

athleteList.add(new Athlete(cyclicBarrier,"路人甲"));

athleteList.add(new Athlete(cyclicBarrier,"路人乙"));

Executor executor = Executors.newFixedThreadPool(8);

for (Athlete athlete : athleteList) {

executor.execute(athlete);

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值