美文网首页
Java并发编程 - 栅栏(CyclicBarrier)

Java并发编程 - 栅栏(CyclicBarrier)

作者: FX_SKY | 来源:发表于2017-04-26 00:11 被阅读160次

同步工具类可以是任何一个对象,只要它根据其自身的状态来协调线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括 信号量(Semaphore)、栅栏(CyclicBarrier)以及闭锁(Latch)。

本文重点介绍CyclicBarrier的使用以及应用场景。

CyclicBarrier

CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

CyclicBarrier方法列表

构造函数:

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

方法:

  • int await():在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
  • int await(long timeout, TimeUnit unit):在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。
  • int getNumberWaiting():返回当前在屏障处等待的参与者数目。
  • int getParties():返回要求启动此 barrier 的参与者数目。
  • boolean isBroken():查询此屏障是否处于损坏状态。
  • void reset():将屏障重置为其初始状态。

示例

package com.bytebeats.concurrent.api;

import java.util.Random;
import java.util.concurrent.*;

/**
 * ${DESCRIPTION}
 *
 * @author Ricky Fung
 * @create 2017-04-24 23:13
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) {

        int parties = 5;
        ExecutorService pool = Executors.newFixedThreadPool(parties);

        final CyclicBarrier barrier = new CyclicBarrier(parties);

        for(int i=0; i<parties; i++){

            Runnable task = new Runnable() {
                @Override
                public void run() {

                    try {
                        int time = new Random().nextInt(5000);
                        TimeUnit.MILLISECONDS.sleep(time);

                        System.out.println("thread "+Thread.currentThread().getName()+" 到达集合点");
                        barrier.await();    //到达集合点, 数量加1
                        System.out.println("thread "+Thread.currentThread().getName()+" 通过集合点继续往后执行");

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            };

            pool.execute(task);
        }

        pool.shutdown();
    }

}

源码下载

https://github.com/TiFG/daily-codelab/tree/master/concurrent-api-sample

相关文章

网友评论

      本文标题:Java并发编程 - 栅栏(CyclicBarrier)

      本文链接:https://www.haomeiwen.com/subject/vwibzttx.html