CyclicBarrier 栅栏机制

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

示例代码:

@Test
    public void testCyclicBarrier() throws Exception{
        //J.U.C并发编程 栅栏机制
        CyclicBarrier cyclicBarrier = new CyclicBarrier(20000);
        for (int i = 0; i < 20000; i++) {
            new Thread(()->{
                try {
                    System.out.println("我已经进来啦,查询商品");
                    cyclicBarrier.await(); //等待,栅栏拦住线程,等待栅栏开启,2000线程执行此段代码
                    Spu spu = spuMapper.selectByPrimaryKey("1335518444044419072");
                    System.out.println("已经查到商品啦,商品名"+spu.getName());
                }catch (Exception e){
                    e.printStackTrace();
                }

            }).start();
        }
        System.in.read(); //不关闭程序
    }

 输出结果

我已经进来啦,查询商品
我已经进来啦,查询商品
我已经进来啦,查询商品
我已经进来啦,查询商品
我已经进来啦,查询商品
2020-12-28 17:34:49.854  INFO 42876 --- [       Thread-8] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-12-28 17:34:49.857  WARN 42876 --- [       Thread-8] com.zaxxer.hikari.util.DriverDataSource  : Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation.
2020-12-28 17:34:50.597  INFO 42876 --- [       Thread-8] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机
已经查到商品啦,商品名智能手机

api

 

方法摘要
int await()
          在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
int await(long timeout, TimeUnit unit)
          在所有参与者都已经在此屏障上调用 await 方法之前,将一直等待。
int getNumberWaiting()
          返回当前在屏障处等待的参与者数目。
int getParties()
          返回要求启动此 barrier 的参与者数目。
boolean isBroken()
          查询此屏障是否处于损坏状态。
void  

 

构造方法摘要
CyclicBarrier(int parties)
          创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在每个 barrier 上执行预定义的操作。
CyclicBarrier(int parties, Runnable barrierAction)
          创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行

与CountDownLatch的区别

CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。

CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。

posted @ 2020-12-28 17:37  *乐途*  阅读(173)  评论(0)    收藏  举报