java 栅栏_Java 并发工具类(栅栏 CyclicBarrier )

CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行地执行工作,然后在下一个步骤之前等待,直到所有任务都完成。栅栏和闭锁的关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行。

闭锁用于等待事件,而栅栏是线程之间彼此等待,等到都到的时候再决定做下一件事。

拿运动员的事情举例,运动员们跑到终点,互相等待所有人都到达终点后,再一起去做喝酒这件事。(运动员也许不能喝酒的,也许大家再跑一轮。)

下面用一个赛马程序来举例:

3376db9cd0a82eeb361da5347f6cf5b2.png

```java

package concurrency;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.*;

class Horse implements Runnable {

private static int counter = 0;

private final int id = counter++;

private int strides = 0;

private static Random rand = new Random(47);

private static CyclicBarrier barrier;

public Horse(CyclicBarrier b) {barrier = b;}

public synchronized int getStrides() {return strides;}

public void run() {

try {

while (!Thread.interrupted()) { //线程内不断循环

synchronized (this) {

strides += rand.nextInt(3); //每次马可以走0,1或者2步

}

barrier.await(); //走完后,就等所有其它马也走完,才能开始下一回合

}

} catch (InterruptedException e) {

} catch (BrokenBarrierException e) {

throw new RuntimeException(e);

}

}

@Override

public String toString() {

return "Horse " + id + " ";

}

public String tracks() {

StringBuilder s =new StringBuilder();

for(int i = 0; i < getStrides();i++)

s.append("*"); //这里打印每个马走的轨迹

s.append(id);

return s.toString();

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值