线程辅助类(四)--CyclicBarrier

CyclicBarrier是一类线程辅助类,用于在多个线程间,在某一个点相互等待,

待所有线程都到齐后,每个线程再接着往下执行,在同步点,可以操作执行(由最后一个到达同步点的线程执行)。

CyclicBarrier涉及到的关键点有如下几点:

1、new CyclicBarrier(n)  ,即初始化时,指定在n个线程间进行同步;

2、new CyclicBarrier(n,barrierAction) ,另一种初始化方式,指定在n个线程间进行同步,

      同时与1不同的是,有同步点处理barrierAction,需要注意的是,在各线程均到达同步点后,

     barrierAction才会被调用(其实也就是最后一个到达同步点的线程执行),接下来各线程才会执行各自的逻辑;

3、cb.await() ,每个线程到同步点后调用,等待其它线程到同步点。

实例如下:

public class CyclicBarrierMain {

    public static void main(String[] args) throws Exception {
//        runWait();  //无同步点处理
        runWaitWithBarrierAction(); //有同步点处理
    }

    static class Operator implements Runnable{

        private CyclicBarrier cb;

        public Operator(CyclicBarrier cb) {
            this.cb = cb;
        }

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+ " step one");
            try {
                cb.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+ " step two");
        }
    }


    static void runWait(){
        ExecutorService es = Executors.newCachedThreadPool();
        CyclicBarrier cb = new CyclicBarrier(5);
        for(int i=0;i<5;i++){
            es.execute(new Operator(cb));
        }
        es.shutdown();
    }


    static class BarrierAction implements Runnable{

        @Override
        public void run() {
            try {
                System.out.println();
                TimeUnit.MILLISECONDS.sleep(500);
                System.out.println(Thread.currentThread().getName()+ " finished");
                System.out.println();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /* 执行完后的有同步点处理 */
    static void runWaitWithBarrierAction(){
        ExecutorService es = Executors.newCachedThreadPool();
        CyclicBarrier cb = new CyclicBarrier(5,new BarrierAction());
        for(int i=0;i<5;i++){
            es.execute(new Operator(cb));
        }
        es.shutdown();
    }
}


运行结果:

pool-1-thread-1 step one
pool-1-thread-2 step one
pool-1-thread-4 step one
pool-1-thread-5 step one
pool-1-thread-3 step one


pool-1-thread-3 finished


pool-1-thread-1 step two
pool-1-thread-4 step two
pool-1-thread-2 step two
pool-1-thread-5 step two
pool-1-thread-3 step two



你可能感兴趣的:(java多线程)