CyclicBarrier:栅栏
构造方法:
// 一起执行的线程数
public CyclicBarrier(int parties)
// 一起执行的线程数,barrierAction优先开始执行的线程
public CyclicBarrier(int parties, Runnable barrierAction)
主要方法:
await方法:让线程进入barrier状态,当进入barrier状态的线程数到达构造CyclicBarrier的parties数量时,这些线程就会一起执行
使用场景
8个运动员准备就位,然后一起跑步
思路:设置一个等待数量为8的CyclicBarrier,然后每个线程调用await,让其进入barrier状态,当barrier状态到达8时,就会一起执行
代码:
线程类:
class JymCyclicBarrierThread implements Runnable{
private CyclicBarrier cyclicBarrier;
private String name;
public JymCyclicBarrierThread(CyclicBarrier cyclicBarrier, String name) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}
public void run() {
System.out.println(name+"就位");
try {
cyclicBarrier.await();
int time = new Random().nextInt(5);
Thread.sleep(time*1000);
System.out.println(name+"用时:"+time);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
线程池:
class JymExecutor{
private CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
public void start(){
List<JymCyclicBarrierThread> jymCyclicBarrierThreadList = new ArrayList<JymCyclicBarrierThread>();
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"亚索"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"盖伦"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"佐伊"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"薇恩"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"奎因"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"赵信"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"皇子"));
jymCyclicBarrierThreadList.add(new JymCyclicBarrierThread(cyclicBarrier,"剑圣"));
ExecutorService executor = Executors.newFixedThreadPool(8);
for (JymCyclicBarrierThread jymCyclicBarrierThread : jymCyclicBarrierThreadList) {
executor.submit(jymCyclicBarrierThread);
}
executor.shutdown();
}
}
测试代码:
public static void main(String[] args) {
JymExecutor jymExecutor = new JymExecutor();
jymExecutor.start();
}
结果: