Java并发编程之基础篇(五)——闭锁、栅栏、信号量
闭锁——CountDownLatch
闭锁类似于一道大门,所有的线程都在大门外等候,当大门打开时,所有线程一起开工。
CountDownLatch提供了一个构造函数,可以传入一个整数作为参数,表示初始计数器。每调用一次countDown()方法时,计数器减一,当计数器减到0时,表示大门开放。可以把CountDownLatch想象成赛车的倒计时计数器,当计数器为0时,所有赛车加速驶出。
下面我们通过开发一个简单的压力测试小工具来演示CountDownLatch的使用。
压力测试小工具
在测试一个系统的处理能力的时候,往往要求测试工具能够模拟出多个客户端同一时刻对服务端发起请求的情况,以此来判断系统的抗压能力。下面的代码借助CountDownLatch实现了该功能,并统计出最后一条请求的完成时间,以此来判断系统的最大TPS。
public class Task implements Runnable {
//开始计数器
private final CountDownLatch startGate;
//结束计数器
private final CountDownLatch endGate;
public Task(CountDownLatch startGate, CountDownLatch endGate){
this.startGate = startGate;
this.endGate = endGate;
}
@Override
public void run() {
try {
//创建好的线程在此处等待
startGate.await();
System.out.println(Thread.currentThread().getName() + "开始执行" + System.currentTimeMillis());
//模拟真正的任务执行
Thread.sleep(new Random().nextInt(10)*100);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//线程执行完,对结束计数器减一
endGate.countDown();
}<