线程辅助类(四)--CyclicBarrier

来源:互联网 发布:奇点大学 知乎 编辑:程序博客网 时间:2024/06/14 07:58

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



原创粉丝点击