zoukankan      html  css  js  c++  java
  • java5 CyclicBarrier同步工具

    CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。

    CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。

    例如:组织人员(线程)郊游,约定一个时间地点(路障),人员陆续到达地点,等所有人员全部到达,开始到公园各玩各的,再到约定时间去食堂吃饭,等所有人到齐开饭……

    package com.ljq.test.thread;
    
    
    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();
    						
    						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();
    	}
    }

    打印结果:

    线程pool-1-thread-1即将到达集合地点1,当前已有1个已经到达,正在等候
    线程pool-1-thread-3即将到达集合地点1,当前已有2个已经到达,正在等候
    线程pool-1-thread-2即将到达集合地点1,当前已有3个已经到达,都到齐了,继续走啊
    线程pool-1-thread-2即将到达集合地点2,当前已有1个已经到达,正在等候
    线程pool-1-thread-3即将到达集合地点2,当前已有2个已经到达,正在等候
    线程pool-1-thread-1即将到达集合地点2,当前已有3个已经到达,都到齐了,继续走啊
    线程pool-1-thread-2即将到达集合地点3,当前已有1个已经到达,正在等候
    线程pool-1-thread-1即将到达集合地点3,当前已有2个已经到达,正在等候
    线程pool-1-thread-3即将到达集合地点3,当前已有3个已经到达,都到齐了,继续走啊
    

      

  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/linjiqin/p/3217451.html
Copyright © 2011-2022 走看看