CyclicBarrier:栅栏的概念,多线程的进行阻塞(即阻塞多个线程),等待某一个临界值条件满足后,同时执行!
假设有只有的一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待!
/*假设有只有的一个场景:每个线程代表一个跑步运动员,
* 当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待!
*
*/
public class UseCyclicBarrier {
//定义运动员类
static class Runner implements Runnable{
private String name;
private CyclicBarrier cyclicBarrier;
public Runner(String name, CyclicBarrier cyclicBarrier) {
super();
this.name = name;
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
System.out.println("运动员:"+this.name+",进行准备工作!");
//随机休眠1到5秒
Thread.sleep(1000 * (new Random()).nextInt(5));
System.out.println("运动员:"+this.name+",准备OK!");
this.cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("运动员:GO!");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义cyclicBarrier,初始化参数3个线程,即有三个运动员都准备好了那就开始。
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
//创建固定3个线程的线程池,运动员进入准备区
ExecutorService executorService = Executors.newFixedThreadPool(3);
//submit运行线程池
executorService.submit(new Thread(new Runner("张三",cyclicBarrier)));
executorService.submit(new Thread(new Runner("李四",cyclicBarrier)));
executorService.submit(new Thread(new Runner("王五",cyclicBarrier)));
//关闭
executorService.shutdown();
}
}
知识点:CountDownLatch与CyclicBarrier的区别
1.CountDownLatch是一个线程在等待,有多个线程发起唤醒通知,即基于一个线程的阻塞然后发起唤醒;
2.CyclicBarrier是基于多个线程的阻塞然后同时发起唤醒;
3.在分布式系统中也可以用到这两种方法,但是分布式框架中有其它解决模式。
扩展:Apache Curator框架:提供分布式锁、分布式定时器、分布式CyclicBarrier、分布式CountDownLatch、分布式队列