CountDownLatch类在性能测试中应用
时间:2022-07-22
本文章向大家介绍CountDownLatch类在性能测试中应用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
CountDownLatch
类位于java.util.concurrent
包下,利用它可以实现计数器的功能。比如有一堆任务需要多线程去执行,需要在所有任务执行完之后才能进行下一步这个场景,此时就可以利用CountDownLatch
来实现这种功能了。
基本介绍
CountDownLatch
类只提供了一个构造器,只有一个int
类型的参数,表示计数器的初始值。
/**
* Constructs a {@code CountDownLatch} initialized with the given count.
*
* @param count the number of times {@link #countDown} must be invoked
* before threads can pass through {@link #await}
* @throws IllegalArgumentException if {@code count} is negative
*/
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
重要方法
前两个是等待所有任务结束的方法,第二个方法有一个超时控制,第一个参数是时间,第二个参数是时间的单位,一般是秒或者毫秒。第三个方法就是计数器减一的方法。性能测试中常用的也就这三个。
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}
public void countDown() {
sync.releaseShared(1);
}
实践
下面是我写的性能框架用到的地方,首先是构建任务:
/**
* 执行多线程任务
*/
public PerformanceResultBean start() {
startTime = Time.getTimeStamp();
for (int i = 0; i < threadNum; i++) {
ThreadBase thread = getThread(i);
thread.setCountDownLatch(countDownLatch);
executorService.execute(thread);
}
shutdownService(executorService, countDownLatch);
endTime = Time.getTimeStamp();
threads.forEach(x -> {
if (x.status()) failTotal++;
errorTotal += x.errorNum;
excuteTotal += x.excuteNum;
});
logger.info("总计{}个线程,共用时:{} s,执行总数:{},错误数:{},失败数:{}", threadNum, Time.getTimeDiffer(startTime, endTime), excuteTotal, errorTotal, failTotal);
return over();
}
下面是多线程基类run()
用到的地方:
@Override
public void run() {
try {
before();
List<Long> t = new ArrayList<>();
long ss = Time.getTimeStamp();
long et = ss;
while (true) {
try {
threadmark = mark == null ? EMPTY : this.mark.mark(this);
long s = Time.getTimeStamp();
doing();
et = Time.getTimeStamp();
excuteNum++;
long diff = et - s;
t.add(diff);
if (diff > HttpClientConstant.MAX_ACCEPT_TIME) marks.add(diff + CONNECTOR + threadmark);
if ((et - ss) > time || status() || key) break;
} catch (Exception e) {
logger.warn("执行任务失败!", e);
logger.warn("执行失败对象的标记:{}", threadmark);
errorNum++;
}
}
long ee = Time.getTimeStamp();
logger.info("执行次数:{}, 失败次数: {},总耗时: {} s", excuteNum, errorNum, (ee - ss) / 1000 + 1);
Concurrent.allTimes.addAll(t);
Concurrent.requestMark.addAll(marks);
} catch (Exception e) {
logger.warn("执行任务失败!", e);
} finally {
after();
}
}
下面是after()
方法的内容:
@Override
protected void after() {
super.after();
marks = new ArrayList<>();
GCThread.stop();
}
- 把图片变成字体,然后在引入到网页
- Flutter环境搭建
- java.net.ConnectException: Call From slaver1/192.168.19.128 to slaver1:8020 failed on connection exc
- 18/03/18 04:53:44 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your clu
- 技术干货 | Hadoop3.0稳定版安装攻略来啦!
- ios逆向工具MonkeyDev简介
- 自定义下拉列表
- 身份证号码验证算法
- 技术干货 | hive安装部署
- js图片的预加载功能
- 简单理解通过原型继承
- 为我们的Web添加HTTPS支持
- 技术干货 | hbase配置详解
- javascript事件详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel 实现用户登录注销并限制功能
- PHP Swoole异步Redis客户端实现方法示例
- PHP全局使用Laravel辅助函数dd
- 在laravel中实现ORM模型使用第二个数据库设置
- laravel5.1 ajax post 传值_token示例
- Laravel框架处理用户的请求操作详解
- Laravel实现ORM带条件搜索分页
- Laravel等框架模型关联的可用性浅析
- laravel5.6中的外键约束示例
- Yii框架核心组件类实例详解
- Python 绘制可视化折线图
- Laravel (Lumen) 解决JWT-Auth刷新token的问题
- PHP单元测试配置与使用方法详解
- Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
- laravel 查询数据库获取结果实现判断是否为空