import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
/**
* 文件功能:CyclicBarrier 多线程线程协调辅助工具
* 故事,一个班5个士兵同时端枪射击
* Created
*/
public class CyclicBarrierSample {
static CyclicBarrier cyclBr=new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("听班长口令,开始射击----");
}
});
public static void main(String args[]){
for(int i=0;i<=4;i++){
new MyThread2("A班士兵"+i,cyclBr).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B班开始准备射击(重复使用CyclicBarrier)************");
for(int i=0;i<=4;i++){
new MyThread2("B班士兵"+i,cyclBr).start();
}
}
}
class MyThread2 extends Thread{
CyclicBarrier cyclBr;
public MyThread2(String name,CyclicBarrier cyclBr){
super(name);
this.cyclBr=cyclBr;
}
public void run()
{
System.out.println(Thread.currentThread().getName()+"端枪,准备好..." );
try {
cyclBr.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"射击>>>>>>");
}
}
预期输出:
A班士兵1端枪,准备好... A班士兵2端枪,准备好... A班士兵3端枪,准备好... A班士兵0端枪,准备好... A班士兵4端枪,准备好... 听班长口令,开始射击---- A班士兵4射击>>>>>> A班士兵1射击>>>>>> A班士兵2射击>>>>>> A班士兵3射击>>>>>> A班士兵0射击>>>>>> B班开始准备射击(重复使用CyclicBarrier)************ B班士兵0端枪,准备好... B班士兵2端枪,准备好... B班士兵4端枪,准备好... B班士兵3端枪,准备好... B班士兵1端枪,准备好... 听班长口令,开始射击---- B班士兵1射击>>>>>> B班士兵0射击>>>>>> B班士兵2射击>>>>>> B班士兵4射击>>>>>> B班士兵3射击>>>>>>
import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
* 文件功能:CountDownLatch 多线程计数同步工具
* Created
* 故事,一个班里5个兵紧急集合。
* 模拟 集合时间统计。
*/
public class CountDownLatchSample {
static CountDownLatch bugleCall=new CountDownLatch(1);//吹响集结号
static CountDownLatch assemblied=new CountDownLatch(5);//集结完毕
public static void main(String[] args){
for(int i=0;i<5;i++){
new Thread(new Soldier("士兵"+i,bugleCall,assemblied)).start();
try {
Thread.sleep(1000);//等1s都睡下了吧
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("班长吹响集结号--------------");
Long startTime=System.currentTimeMillis();
bugleCall.countDown();
try {
assemblied.await();
System.out.println("集结完毕,本次集结耗时:【"+(System.currentTimeMillis()-startTime)/1000+"】秒。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Soldier implements Runnable{
CountDownLatch listen;//听号声集合
CountDownLatch report;//集结完毕,报告
String name;
public Soldier(String name,CountDownLatch listen,CountDownLatch report){
this.listen=listen;
this.name=name;
this.report=report;
}
@Override
public void run() {
try {
System.out.println(this.name + "正在做美梦。。。");
listen.await();
System.out.println(this.name + "听到号声,开始起床集合。");
Thread.sleep(new Random().nextInt(5000));//随机延时5秒引内
System.out.println(this.name + "集合完毕。");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
report.countDown();
}
}
}
预期输出:
士兵0正在做美梦。。。 士兵1正在做美梦。。。 士兵2正在做美梦。。。 士兵3正在做美梦。。。 士兵4正在做美梦。。。 班长吹响集结号-------------- 士兵0听到号声,开始起床集合。 士兵3听到号声,开始起床集合。 士兵2听到号声,开始起床集合。 士兵1听到号声,开始起床集合。 士兵4听到号声,开始起床集合。 士兵3集合完毕。 士兵0集合完毕。 士兵4集合完毕。 士兵2集合完毕。 士兵1集合完毕。 集结完毕,本次集结耗时:【2】秒。