CyclicBarrier模拟多个线程开始,等线程都到达的时候继续执行

package com.java.basis.threads;
 
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 /**
  * CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。
  * 在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。
  * 因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。
  * CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),
  * 该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。 
  * @author fliay
  *
  */
public class CyclicBarrierTest {
 
    public static void main(String[] args) {
    	ExecutorService exec=Executors.newFixedThreadPool(3);
    	final CyclicBarrier cyb=new CyclicBarrier(3);//约定一个数字
    	for(int i=0;i<3;i++){
    		Runnable runnable=new Runnable() {
				
				public void run() {

					try{
						for(int j=1;j<10;j++){
						Thread.sleep((long) (Math.random()*10000));
						System.out.println("线程"+Thread.currentThread().getName()+"到达集合地点"+j+",当前已有"+(cyb.getNumberWaiting()+1)+"个已经到达,"+(cyb.getNumberWaiting()==2?"人到齐了继续赶路":"等待剩下"+(3-(cyb.getNumberWaiting()+1))+"人"));
						cyb.await();//等待所有到达
						}
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			};
			exec.execute(runnable);
    	}
    	exec.shutdown();
    	
    }    
}

  

posted @ 2016-10-14 10:49  fliay  阅读(407)  评论(0)    收藏  举报