zoukankan      html  css  js  c++  java
  • java多线程系列9 高级同步工具(3) CyclicBarrier

    CyclicBarrier 

     一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)   然后一再执行

     

    public class CyclicBarrierTest {
    
         
         public static void main(String[] args) {
        	 ExecutorService pool = Executors.newFixedThreadPool(3);
        	 //这里定义的是3 也就是必须三个线程中 都调用了barrier.await()方法才可以执行await后面的代码 不然一直等待
        	 CyclicBarrier barr = new CyclicBarrier(3);
        	pool.submit( new Thread(new Runner(barr, "c1")));
        	pool.submit( new Thread(new Runner(barr, "c2")));
        	pool.submit( new Thread(new Runner(barr, "c3")));
        	 pool.shutdown();
    	}
    }
    class Runner implements Runnable{
    	private   CyclicBarrier barrier ;
    	private String name ;
    	
    	public Runner(CyclicBarrier barrier, String name) {
    		super();
    		this.barrier = barrier;
    		this.name = name;
    	}
    
    	@Override
    	public void run() {
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e1) {
    			e1.printStackTrace();
    		}
    		System.out.println(name+" 准备 ");
    		try {
    			 // await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
    			barrier.await();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		System.out.println(name+" go ");
    	}
    	 
     }
    

        运行结果如下

      

     在这里 需要说下和CountDownLatch的区别

      CountDownLatch 阻塞的是 主线程 

      CyclicBarrier  阻塞的是子线程

      CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

  • 相关阅读:
    android 5.1 WIFI图标上的感叹号及其解决办法
    Recovery和Charger模式下屏幕旋转180度
    Android屏幕旋转总结
    Spring MVC 数据校验@Valid
    Spring注解装配
    Spring简单的REST例子
    Spring怎么引入多个xml配置文件
    spring使用c3p0报错
    Spring+JTA+Atomikos+MyBatis分布式事务管理
    (2-3)Eureka详解
  • 原文地址:https://www.cnblogs.com/javabigdata/p/6946346.html
Copyright © 2011-2022 走看看