天天看点

并发工具类CountDownLatch

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) QQ群:878059749交流学习。

实际开发当中,我们对并发的情况碰到的比较少,而且也很难去进行观测。如果对某些场景进行测试的时候,我们仅有的并发编程知识是没有办法完成并发测试的。可能我们需要一些工具,比如jmeter这样的测试工具,但是工具毕竟是别人做好的东西,不能和我们自己定义的测试类来进行对比。CountDownLatch就可以帮我们办到完成并发的测试,并且根据我们的要求来定制测试场景

CountDownLatch概述

CountDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier,他们的作用都不尽相同。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。

CountDownLatch主要作用

  • 并发线程计数器
  • 并发场景发起工具

CountDownLatch的不足

CountDownLatch是一次性的,计算器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。

CountDownLatch其实可以把它看作一个计数器

该类主要的方法就三个

  • CountDownLatch(int count) //实例化一个倒计数器,count指定计数个数
  • countDown() // 计数减一
  • await() //等待,当计数减到0时,所有线程并行执行
import java.util.concurrent.CountDownLatch;
import java.util.stream.IntStream;
public class Test {

    private static CountDownLatch countDownLatch = new CountDownLatch(10);

    public static void main(String[] args) {

        IntStream.range(0, 10).forEach(it -> {
            new Thread(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("正在准备第" + it + "个线程");
                countDownLatch.countDown();
            }).start();
        });

        try {
            countDownLatch.await();
            System.out.println("10个线程执行完成, main线程结束");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}
           
从实例中我们可以看到main线程一定是最后执行完成的,当我们countDown方法执行计数到0的时候,我们新建的线程都会一起执行,那么这样就能够达到我们想要的并发效果

总结CountDownLatch是一个并发计数器,能够帮我们很好的模拟并发场景