Java并发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 void main(String[] args) {
        fatherToClimb();  
        motherToClimb();
        meToClimb();
        toClimb();
    }
}

输出结果:


Java并发CountDownLatch之三个一起约登山_第1张图片
输出结果1

这样的输出显然是不正确的,因为他们三个去山下是同时进行的,不是像现在这样一共花费了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();
    }
}

运行结果:

Java并发CountDownLatch之三个一起约登山_第2张图片
运行结果2

看上去结果还是不正确,因为小明到了山下就开始登山了,显然是错误的。

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

    }
}

运行结果:

Java并发CountDownLatch之三个一起约登山_第3张图片
运行结果3

避免使用忙等,我们使用了CountDowmLatch 实现了我们的需求。下面具体介绍一下这个哥们:
Latch闭锁的意思,是一种同步的工具类。类似于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭着的,不允许任何线程通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。且当门打开了,就永远保持打开状态。
作用:可以用来确保某些活动直到其他活动都完成后才继续执行。
使用场景:
1、例如我们上例中所有人都到达山下,然后开始登山;
2、某个操作需要的资源初始化完毕
3、某个服务依赖的线程全部开启等等...
CountDowmLatch是一种灵活的闭锁实现,包含一个计数器,该计算器初始化为一个正数,表示需要等待事件的数量。countDown方法递减计数器,表示有一个事件发生,而await方法等待计数器到达0,表示所有需要等待的事情都已经完成。

你可能感兴趣的:(Java并发CountDownLatch之三个一起约登山)