码迷,mamicode.com
首页 > 编程语言 > 详细

Java CyclicBarrier 浅谈

时间:2018-04-10 13:45:04      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:imp   .sh   java   span   复杂   rgs   构造   class   抛出异常   

CyclicBarrier 意思是栅栏, 可以让多组线程到达某个点后开始等待, 等指定的线程数量都到达后再恢复线程, 这个CyclicBarrier是可以循环使用的. 又称为循环栅栏.

栗子:

public class BarrierDemo {
    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(5);
        final CyclicBarrier barrier = new CyclicBarrier(5);
        for (int i = 0; i < 5; i++) {
            service.execute(new Player("玩家" + i, barrier));
        }
        service.shutdown();
    }
}
public class Player implements Runnable {
    private final String name;
    private final CyclicBarrier barrier;

    public Player(String name, CyclicBarrier barrier) {
        this.name = name;
        this.barrier = barrier;
    }

    public void run() {
        try {
            TimeUnit.SECONDS.sleep(1 + (new Random().nextInt(3)));
            System.out.println(name + "已准备,等待其他玩家准备...");
            barrier.await();
            TimeUnit.SECONDS.sleep(1 + (new Random().nextInt(3)));
            System.out.println(name + "已加入游戏");
        } catch (InterruptedException e) {
            System.out.println(name + "离开游戏");
        } catch (BrokenBarrierException e) {
            System.out.println(name + "离开游戏");
        }

    }
}

CyclicBarrier 有两个构造函数:

public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)

参数parties指定线程数量,当指定的线程值都到达栅栏点时,栅栏打开,线程恢复。需要注意的是,当指定的线程数量大于启动的线程数量,比如修改上例中的代码,只启动9个线程,那么所有的线程将一直处于等待状态。第二种情况是指定的线程数量小于启动的线程,上例代码,启动11个线程,那么当第十个线程到达栅栏点时,那么这十个线程就会恢复继续执行,而第十一个线程将一直处于阻塞状态。

CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties, Runnable barrierAction),用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。

CyclicBarrier的方法:

1. await() 使用该方法可以使得当前线程在栅栏点处进行阻塞, 等待所有线程.

2. await(long timeout, TimeUnit unit) 增加timeout参数, 等待超时后会抛出异常.

3. getNumberWaiting() 返回当前在栅栏处等待的参与者数目。此方法主要用于调试和断言。

4. getParties() 该方法可以获得构造函数中指定的需要在栅栏点阻塞的线程数量

 

Java CyclicBarrier 浅谈

标签:imp   .sh   java   span   复杂   rgs   构造   class   抛出异常   

原文地址:https://www.cnblogs.com/it-dennis/p/8777877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!