CyclicBarrier&CountDownLatch&Exchanger 同步工具

CyClicBarrier

画了一个图解释CyclicBarrier的功能:


     ExecutorService threadPool=Executors.newFixedThreadPool(3);
      final CyclicBarrier cb =new CyclicBarrier(3);
      
     for(int i =0;i<3;i++){
    	 Runnable runnable=new Runnable(){

			@Override
			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();
				}
				
				
			}};
			threadPool.execute(runnable);
     }
     threadPool.shutdown();

CountDownLatch

就像是一个倒计时器,当时间到达0时便开始执行后面的代码。 通过代码可以更直接理解这个功能。
应用场情:如:做一个百米比赛的游戏时可以应用这个功能,所有运动员等待裁判的一个声令下开始奔跑。所有运行员到达终点后公布成绩。
  ExecutorService threadPool=  Executors.newFixedThreadPool(3);
     
    final CountDownLatch cdOrder=new CountDownLatch(1);
    final CountDownLatch cdAnswer=new CountDownLatch(3);
    for(int i =0;i<3;i++){
    	Runnable runnable=new Runnable(
    			){

					@Override
					public void run() {
						try {
					System.out.println("线程 "+Thread.currentThread().getName()
							+"正在等待命令! ");
					
						cdOrder.await();
						
						System.out.println("线程 "+Thread.currentThread().getName()
								+"已经接收了命令! ");
						Thread.sleep((long)Math.random()*10000);
						System.out.println("线程 "+Thread.currentThread().getName()
								+"完成了命令! ");
						cdAnswer.countDown();
						
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
						
					}};
					threadPool.execute(runnable);
    }
	try {
		Thread.sleep((long)Math.random()*10000);
		System.out.println("线程 "+Thread.currentThread().getName()
				+"即将发布命令! ");
		cdOrder.countDown();
		System.out.println("线程 "+Thread.currentThread().getName()
				+"已经发布了命令! ");
		cdAnswer.await();
		System.out.println("线程 "+Thread.currentThread().getName()
				+"已经收到所有响应结果! ");
		
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	

Exchanger

用于交换两个线程间的数据。


	final Exchanger<String> ex =new Exchanger<String> ();
       new Thread(
    		   new Runnable(){

		@Override
		public void run() {
		String data="hbb";
		System.out.println("线程 "+Thread.currentThread().getName()
				+" 准备把 数据 "+data+"换出去 ");
		try {
			Object changeData =ex.exchange(data);
			System.out.println("线程 "+Thread.currentThread().getName()+"换回来的数据 是"+changeData);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
		}}).start();
       new Thread(
    		   new Runnable(){

		@Override
		public void run() {
			String data="hycollege";
			System.out.println("线程 "+Thread.currentThread().getName()
					+" 准备把 数据 "+data+"换出去 ");
			try {
				Object changeData =ex.exchange(data);
				System.out.println("线程 "+Thread.currentThread().getName()+"换回来的数据 是"+changeData);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				
			
		}}).start();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值