并发新构件之CyclicBarrier

CyclicBarrier:叫做循环栅栏,名字挺好听的。JDK描述:允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。

作用是好比我们一行人要去做地铁,每个人就是一个线程,来的人有早有晚(仿佛多个线程执行情况不一样),但是必须都到齐车站后,才能上车,少一个都不行,先到的人等待(await()),最后一个人await()之后发现人数齐了,所有人上车(所有线程再往下执行)。

构造器: CyclicBarrier(N);这个栅栏负责N个线程协作
await():如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,直到发生下列事情之一:
  • 要么最后一个线程到达; 
  • 要么超过指定的超时  
  • 要么一些其他线程调用当前线程interrupt  
  • 要么一些其他线程在等待屏障时超时 
  • 其他一些线程在这个障碍上调用reset() 。
package com.houjun.current.newClassBank;

import java.util.concurrent.*;

/**
 * @Author: HouJun
 * @Date: 2019/10/17 13:43
 * @Description: 循环栅栏
 * @version: 1.0
 */
public class CyclicBarrierTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
        for (int i = 0; i < 5; i++) {
            executorService.execute(new Way2(cyclicBarrier));
        }
    }
}

class Way2 implements Runnable {
    private CyclicBarrier cyclicBarrier;

      Way2(CyclicBarrier cyclicBarrier) {
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        try {
            System.out.println("线程"+this+"到达");
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println("全部到达北京西,一起出发吧");
    }
}
原文地址:https://www.cnblogs.com/houj/p/11691689.html