CyclicBarrier&CountDownLatch&Exchanger 同步工具
2014-10-13 08:57
477 查看
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();
相关文章推荐
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser、Exchanger)
- CountDownLatch、CyclicBarrier & Semaphore
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- Java/Android多线程并发、同步,线程之间通信,主、子线程的一些问题(CountDownLatch、CyclicBarrier和Semaphore)
- 黑马程序员-Semaphore、CyclicBarrier、CountDownLatch、Exchanger
- CountDownLatch & CyclicBarrier源码Android版实现解析
- Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
- java多线程之闭锁(CountDownLatch)、同步屏幕(CyclicBarrier)、信号量(Semaphore)
- java 并发工具类CountDownLatch & CyclicBarrier
- Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用
- Java并发编程之2——同步工具类的使用(CountDownLatch,CyclicBarrier,BlockungQueue,Semaphore)
- (12)java5的CountDownLatch、Exchanger同步工具
- (12)java5的CountDownLatch、Exchanger同步工具
- Java 多线程协调工具 CyclicBarrier 与CountDownLatch 学习
- 多线程并发常用类:condition,semaphore,CyclicBarrier,countdownlatch,exchanger使用整理
- Java_并发线程_Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- Java线程知识__其他几种线程同步的工具类的使用(CyclicBarrier,CountDownLatch,Exchanger)
- 多线程12-CyclicBarrier、CountDownLatch、Exchanger
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
- Join,CountDownLatch,CyclicBarrier,Semaphore和Exchanger