本文已参与「新人创作礼」活动,一起开启掘金创作之路
一:CountDownLatch 使用
场景:
私人健身教练
老王
,等小丽
和小美
换好健身衣服后才开始对她们授课
public class CountDownLatchTest {
class Sporter implements Runnable{
String name; //
int arriverTime; //
CountDownLatch countDownLatch;
Sporter(String name,int arriverTime,CountDownLatch countDownLatch){
this.name=name;
this.arriverTime=arriverTime;
this.countDownLatch=countDownLatch;
}
@Override
public void run() {
try {
System.out.println(name+"开始换衣服");
Thread.sleep(1000*arriverTime);
System.out.println(name+"已经换完衣服");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Executor executor= Executors.newFixedThreadPool(2);
CountDownLatch countDownLatch=new CountDownLatch(2);
executor.execute(new CountDownLatchTest().new Sporter("小丽",3,countDownLatch));
executor.execute(new CountDownLatchTest().new Sporter("小美",5,countDownLatch));
try {
System.out.println("老王着急的等待着自己的学员");
countDownLatch.await();
System.out.println("老王终于开始和小丽小美愉快的进行私教训练了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
老王着急的等待着自己的学员
小丽开始换衣服
小美开始换衣服
小丽已经换完衣服
continus.....
小美已经换完衣服
老王终于开始和小丽小美愉快的进行私教训练了
continus.....
二:CyclicBarrier使用
应用场景: 小明家吃饭规矩,只有等到所有家人都坐到饭桌后,进行一次合照,才能吃饭 家庭成员 小明,小明爸爸 ,小明妈妈
public class CyclicBarrierTest {
class ArriveRunnable implements Runnable{
String name; //
int arriverTime; //
CyclicBarrier cyclicBarrier;
ArriveRunnable(String name,int arriverTime,CyclicBarrier cyclicBarrier){
this.name=name;
this.arriverTime=arriverTime;
this.cyclicBarrier=cyclicBarrier;
}
@Override
public void run() {
try {
Thread.sleep(1000*arriverTime);
System.out.println(name+"已经落座");
cyclicBarrier.await();
System.out.println(name+"开始吃饭");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier=new CyclicBarrier(3, new Runnable() {
@Override
public void run() {
try {
System.out.println("全家开始合影");
Thread.sleep(2000);
System.out.println("合影完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Executor executor= Executors.newFixedThreadPool(3);
//小明 写完作业坐下
executor.execute(new CyclicBarrierTest().new ArriveRunnable("小明",2,cyclicBarrier));
//小明爸爸,抽根烟才坐下
executor.execute(new CyclicBarrierTest().new ArriveRunnable("小明爸爸",4,cyclicBarrier));
//小明妈妈饭做完,才坐下
executor.execute(new CyclicBarrierTest().new ArriveRunnable("小明妈妈",6,cyclicBarrier));
}
}
小明已经落座
小明爸爸已经落座
小明妈妈已经落座
全家开始合影
合影完成
小明妈妈开始吃饭
小明开始吃饭
小明爸爸开始吃饭
CountDownLatch 和CyclicBarrier 的不同 :
CountDownLatch 一个线程等待多个线程的,CyclicBarrier 多个线程互相等待 CountDownLatch 不可以重置计数器,不能重复利用,CyclicBarrier可以