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

java CyclicBarrier的使用

时间:2015-02-11 18:23:36      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

api对CyclicBarrier的描述: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。  也就是说他可以使一组线程先等待 然后达到某个条件之后再一起执行,有点map/reduce的感觉。

举个例子: 目前有个int,  分配3个任务线程对他加1 , 最后主任务线程汇集计算结果,代码如下:

    private static AtomicInteger i = new AtomicInteger(0);
    public static void main(String[] args){
        CyclicBarrier cb = new CyclicBarrier(3,new Runnable() {
            //主任务汇集计算结果
            public void run() {
                System.out.println("结果为" + i.get());
            }
        });
        ExecutorService es = Executors.newFixedThreadPool(5);
        es.submit(new SubTask(cb, "线程一"));
        es.submit(new SubTask(cb, "线程二"));
        es.submit(new SubTask(cb, "线程三"));
        es.shutdown();
    }
    
    //子任务计算
    private static class SubTask implements Runnable{
        private CyclicBarrier cb;
        private String msg;
        public SubTask(CyclicBarrier cb, String msg){
            this.cb = cb;
            this.msg = msg;
        }
        public void run() {
            try {
                System.out.println(msg + " enter");
                i.incrementAndGet();
                Thread.sleep(1000l);
                cb.await();
                System.out.println(msg + " quit");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

结果:

线程一 enter
线程三 enter
线程二 enter
结果为3

线程三 quit
线程二 quit
线程一 quit

java CyclicBarrier的使用

标签:

原文地址:http://www.cnblogs.com/hithlb/p/4286659.html

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