高级并发编程学习之cyclicBarrier

来源:互联网 发布:淘宝9活动都有什么 编辑:程序博客网 时间:2024/05/21 08:42

同步工具之cyclicBarrier

表示大家彼此等待,等大家集合号以后才开始出发。分散活动后又在指定地点集合碰面,好像公司利用周末时间集体郊游一样,先从各自家出发到公司集合后,再同时出发到公园游玩,先到的阻塞等待,从最后到的开始,在指定地点集合后再开始就餐。

package com.lei.lock;/**@author leixingbang_sx*Mail:leixingbang_sx@qiyi.com*@create 2016/1/26 10:07*desc  集合后出发  */import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest {    public static void main(String[] args) {        ExecutorService service = Executors.newCachedThreadPool();        final  CyclicBarrier cb = new CyclicBarrier(3);        for(int i=0;i<3;i++){            Runnable runnable = new Runnable(){                public void run(){                    try {                        Thread.sleep((long)(Math.random()*10000));//cb.getNumberWaiting代表等待的线程数量                        System.out.println("线程" + Thread.currentThread().getName() +                                "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                        cb.await();//达到三个线程集合后,才继续往下执行                        Thread.sleep((long)(Math.random()*10000));                        System.out.println("线程" + Thread.currentThread().getName() +                                "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                        cb.await();                        Thread.sleep((long)(Math.random()*10000));                        System.out.println("线程" + Thread.currentThread().getName() +                                "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                        cb.await();                    } catch (Exception e) {                        e.printStackTrace();                    }                }            };            service.execute(runnable);        }        service.shutdown();    }}


0 0