您的位置:首页 > 其它

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐