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是一个并发计数器,能够帮我们很好的模拟并发场景