Java并发CountDownLatch之三个一起约登山
2017-09-29 本文已影响0人
暖熊熊
小明,小红,小白三个人一起去登山,约好山脚下集合,所有人到齐后开始登山。
public class Test {
public static void fatherToClimb() {
System.out.println("小明去山下需要3小时");
}
public static void motherToClimb() {
System.out.println("小红去山下需要2小时");
}
public static void meToClimb() {
System.out.println("小白去山下需要1小时");
}
public static void toClimb() {
System.out.println("一家人到齐了,开始登山");
}
public static void main(String[] args) {
fatherToClimb();
motherToClimb();
meToClimb();
toClimb();
}
}
输出结果:
![](https://img.haomeiwen.com/i3943248/a9b773571dd10da2.png)
这样的输出显然是不正确的,因为他们三个去山下是同时进行的,不是像现在这样一共花费了6个小时3人才到山下。
修改代码:
public class Test {
public static void fatherToClimb() {
System.out.println("小明去山下需要3小时");
}
public static void motherToClimb() {
System.out.println("小红去山下需要2小时");
}
public static void meToClimb() {
System.out.println("小白去山下需要1小时");
}
public static void toClimb() {
System.out.println("一家人到齐了,开始登山");
}
public static void main(String[] args) {
new Thread(){
public void run() {
fatherToClimb();
}
}.start();
new Thread(){
public void run() {
motherToClimb();
}
}.start();
new Thread(){
public void run() {
meToClimb();
}
}.start();
toClimb();
}
}
运行结果:
![](https://img.haomeiwen.com/i3943248/805e1731c4355174.png)
看上去结果还是不正确,因为小明到了山下就开始登山了,显然是错误的。
import java.util.concurrent.CountDownLatch;
public class Test {
public static void fatherToClimb() {
System.out.println("小明去山下需要3小时");
}
public static void motherToClimb() {
System.out.println("小红去山下需要2小时");
}
public static void meToClimb() {
System.out.println("小白去山下需要1小时");
}
public static void toClimb() {
System.out.println("一家人到齐了,开始登山");
}
public static class Mythread extends Thread{
public void run() {
fatherToClimb();
latch.countDown();
}
}
private static CountDownLatch latch = new CountDownLatch(3);
public static volatile int i = 3;
public static void main(String[] args) throws InterruptedException {
Mythread t1 = new Mythread();
t1.start();
new Thread() {
public void run() {
motherToClimb();
latch.countDown();
}
}.start();
new Thread() {
public void run() {
meToClimb();
latch.countDown();
}
}.start();
latch.await();
toClimb();
}
}
运行结果:
![](https://img.haomeiwen.com/i3943248/68987f936a898fb7.png)
避免使用忙等,我们使用了CountDowmLatch 实现了我们的需求。下面具体介绍一下这个哥们:
Latch闭锁的意思,是一种同步的工具类。类似于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭着的,不允许任何线程通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。且当门打开了,就永远保持打开状态。
作用:可以用来确保某些活动直到其他活动都完成后才继续执行。
使用场景:
1、例如我们上例中所有人都到达山下,然后开始登山;
2、某个操作需要的资源初始化完毕
3、某个服务依赖的线程全部开启等等...
CountDowmLatch是一种灵活的闭锁实现,包含一个计数器,该计算器初始化为一个正数,表示需要等待事件的数量。countDown方法递减计数器,表示有一个事件发生,而await方法等待计数器到达0,表示所有需要等待的事情都已经完成。