CyclicBarrier:栅栏的概念,多线程的进行阻塞,等待某一个临界值条件满足后,同时执行!
假设有只有的一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待!
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);//主方法中,如果有三个人准备好了就进行操作
package com.bfxy.thread.core.juc;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UseCyclicBarrier {
static class Runner implements Runnable {
private String name;
private CyclicBarrier cyclicBarrier;
public Runner(String name, CyclicBarrier cyclicBarrier){
this.name = name;
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
System.err.println("运动员:" + this.name + ", 进行准备工作!");
Thread.sleep(1000 * (new Random()).nextInt(10));
System.err.println("运动员:" + this.name + ", 准备OK!");
this.cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.err.println("运动员: " + this.name + ", GO! GO! GO!");
}
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(new Thread(new Runner("张三", cyclicBarrier)));
executorService.submit(new Thread(new Runner("李四", cyclicBarrier)));
executorService.submit(new Thread(new Runner("王五", cyclicBarrier)));
executorService.shutdown();
}
}