CyclicBarrier是一个线程工具,Cyclic是循环的意思,Barrier是“路障”的意思,CyclicBarrier表示这个“路障”能够循环使用。能够实现的功能:表示你们彼此等待,你们集合好以后才开始出发,分散活动后又在指定的地点集合碰面。java
CyclicBarrier所实现的功能能够用下图来表示:dom
经过代码看一下CyclicBarrier的执行效果:ide
- 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);//3个线程
- for(int i=0;i<3;i++){//建立3个线程
- Runnable runnable = new Runnable(){
- public void run(){
- try {
- Thread.sleep((long)(Math.random()*10000));//每一个线程“休息的”时间不一样
- System.out.println("线程" + Thread.currentThread().getName() +
- "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) +
- "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续前进":"正在等候"));
- cb.await();//先到的等待后到的,当3个都到达时才会继续向下执行
- 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();
- }
- }
程序执行的效果:工具
从上面的执行效果能够看到,3个线程彼此等待,都到达时,才开始执行新的任务。spa