美文网首页
Java并发编程(六) CyclicBarrier

Java并发编程(六) CyclicBarrier

作者: skyguard | 来源:发表于2018-11-15 19:04 被阅读0次

    下面我们来说一下CyclicBarrier,我们知道,CountDownLatch是一个线程等待多个线程执行,那么CyclicBarrier是多个线程互相等待一起到达,再一起执行。CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线程才能继续执行。下面我们就来分析一下CyclicBarrier
    先来看一下CyclicBarrier这个类

    public CyclicBarrier(int parties) {
        this(parties, null);
    }
    
    public CyclicBarrier(int parties, Runnable barrierAction) {
        if (parties <= 0) throw new IllegalArgumentException();
        this.parties = parties;
        this.count = parties;
        this.barrierCommand = barrierAction;
    }
    

    CyclicBarrier的构造方法有2个参数,一个是线程数量parties,一个是屏障打开后的操作barrierAction。
    CyclicBarrier的实现基于ReentrantLock,下面来看一下具体的实现,先来看一下await方法

    public int await() throws InterruptedException, BrokenBarrierException {
        try {
            return dowait(false, 0L);
        } catch (TimeoutException toe) {
            throw new Error(toe); // cannot happen
        }
    }
    

    再到dowait方法

    if (g.broken)
                throw new BrokenBarrierException();
    
            if (Thread.interrupted()) {
                breakBarrier();
                throw new InterruptedException();
            }
    
            int index = --count;
            if (index == 0) {  // tripped
                boolean ranAction = false;
                try {
                    final Runnable command = barrierCommand;
                    if (command != null)
                        command.run();
                    ranAction = true;
                    nextGeneration();
                    return 0;
                } finally {
                    if (!ranAction)
                        breakBarrier();
                }
            }
    

    再到breakBarrier方法

    private void breakBarrier() {
        generation.broken = true;
        count = parties;
        trip.signalAll();
    }
    

    每次调用await方法,count减1,当count=0时,调用signalAll方法唤醒所有线程继续执行。
    CyclicBarrier的分析就到这里了。

    相关文章

      网友评论

          本文标题:Java并发编程(六) CyclicBarrier

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