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();