CyclicBarrier


CyclicBarrier 同

 

CyclicBarrier 是可循使用的障,主要功能是组线程到一个被阻,直到最后一个线程到障才会打;所有被线程才会继续执行。

 

 

属性字段

 

//独占

private final ReentrantLock lock = new ReentrantLock();

//等待的条件

private final Condition trip = lock.newCondition();

//线程等待的数量,重置count

private final int parties;

//被行的任

private final Runnable barrierCommand;

//描述更新代,重置?

//Generation中的broken表示一次是否完成,false。count0时设true

private Generation generation = new Generation();

//记录当前需要等待到来的线程数,等于0表示到下一代,通parties来重置

private int count;

 

 

 

    public CyclicBarrier(int parties, Runnable barrierAction) {

        if (parties <= 0) throw new IllegalArgumentException();

        this.parties = parties;

        this.count = parties;

        this.barrierCommand = barrierAction;

    }

 

        public CyclicBarrier(int parties) {

        this(parties, null);

    }

 

 

CyclicBarrier 用于多线果合并的操作,用于多线算数,最后合并果的景。比如,我需要统计多个 Excel 中的数,然后等到一个总结果。我可以通线一个 Excel ,行完成后得到相果,最后通 barrierAction 来线程的果,得到所有Excel的和。

 

使用

public class CyclicBarrierTest {

    public static void main(String[] args) {

        CyclicBarrier barrier = new CyclicBarrier(3);

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

            new Writer(barrier).start();

        }

    }

 

    static class Writer extends Thread {

        private CyclicBarrier cyclicBarrier;

 

        public Writer(CyclicBarrier cyclicBarrier) {

            this.cyclicBarrier = cyclicBarrier;

        }

 

        @Override

        public void run() {

            System.out.println(Thread.currentThread().getName() + "正在写入数...");

            try {

                Thread.sleep(2000);      //以睡眠来模写入数操作

                System.out.println(Thread.currentThread().getName() + "写入数,等待其他线程写入完");

                cyclicBarrier.await();

            } catch (InterruptedException e) {

                e.printStackTrace();

            } catch (BrokenBarrierException e) {

                e.printStackTrace();

            }

        }

    }

}

Thread-2正在写入数...

Thread-0正在写入数...

Thread-1正在写入数...

Thread-0写入数,等待其他线程写入完

Thread-2写入数,等待其他线程写入完

Thread-1写入数,等待其他线程写入完