Java多线程编程在JMeter中应用
时间:2022-07-22
本文章向大家介绍Java多线程编程在JMeter中应用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在最近的工作中,遇到一个需求:在JMeter
中生成一个全局唯一变量,获取一次自增x(这个不确定,可能根据响应信息)。这不是我的需求,只是从同事那边听说到的,周末没事儿想起来这个事儿。按照我的方案肯定是用Java
或者Groovy
去实现这个需求,肯定不会选JMeter
。
如果非要给这个需求加一个jmeter
的设定,我依然会选择用脚本语言实现,之前也写过一个专题:Groovy在JMeter中应用专题。这次我的基本思路两个:1、还是新建一个全局的线程安全对象,然后通过自带的线程安全方法实现自增需求;2、处理全局变量时,通过Java锁实现单线程操作自增,然后实现多线程情况下的线程安全。
事实证明还是第二种方案比较好,因为我暂时还没找到如果通过脚本去JMeter
里面新建一个全局线程安全类对象的方法。所以我是新建一个全局变量,赋予一个初始值,然后在每个线程脚本里面去处理这个全局变量,步骤如下:1、获取对象锁(这里指的是存放所有全局变量的对象props);2、获取参数值,自增,重新赋值;3、释放对象锁,完成其他逻辑处理。
- 首先新建一个简单的线程组和一个简单的请求:
- 添加JSR223 预处理程序(后置处理程序需要下一次次请求)
脚本内容:
props.put("MY",test()+"")
//log.info(props.get("MY")+"")
def test() {
synchronized (props) {
// Thread.sleep(1000)
int i = props.get("MY") as Integer
log.info(i+"")
i + 1
}
}
这里有一个小知识点:JMeter中的对象props在JVM里面是有缓存的,经过我多次实验,只要JMeter不关闭,这个缓存一只会在。
所以要在程序运行前设置一个初始值,如下:
脚本内容如下:
//int i = props.get("MY") == null ? 0 : props.get("MY") as Integer
props.put("MY","999")
日志输出:
下面是未加锁的情况:
2020-07-19 19:29:50,187 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-3
2020-07-19 19:29:50,191 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-4
2020-07-19 19:29:50,192 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2020-07-19 19:29:50,192 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2020-07-19 19:29:50,199 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-5
2020-07-19 19:29:50,231 INFO o.a.j.m.J.JSR223 变量: 999
2020-07-19 19:29:50,232 INFO o.a.j.m.J.JSR223 变量: 999
2020-07-19 19:29:50,233 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-5
2020-07-19 19:29:50,233 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-5
2020-07-19 19:29:50,235 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-4
2020-07-19 19:29:50,235 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-4
2020-07-19 19:29:50,239 INFO o.a.j.m.J.JSR223 变量: 1000
2020-07-19 19:29:50,240 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2020-07-19 19:29:50,240 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2020-07-19 19:29:50,240 INFO o.a.j.m.J.JSR223 变量: 1000
2020-07-19 19:29:50,241 INFO o.a.j.m.J.JSR223 变量: 1001
2020-07-19 19:29:50,241 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2020-07-19 19:29:50,241 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2020-07-19 19:29:50,241 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-3
2020-07-19 19:29:50,241 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-3
下面是加锁的情况:
2020-07-19 19:28:40,988 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-5
2020-07-19 19:28:41,015 INFO o.a.j.m.J.JSR223 变量: 999
2020-07-19 19:28:41,017 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2020-07-19 19:28:41,017 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2020-07-19 19:28:41,031 INFO o.a.j.m.J.JSR223 变量: 1000
2020-07-19 19:28:41,041 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2020-07-19 19:28:41,043 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2020-07-19 19:28:41,044 INFO o.a.j.m.J.JSR223 变量: 1001
2020-07-19 19:28:41,046 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-5
2020-07-19 19:28:41,046 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-5
2020-07-19 19:28:41,046 INFO o.a.j.m.J.JSR223 变量: 1002
2020-07-19 19:28:41,048 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-4
2020-07-19 19:28:41,048 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-4
2020-07-19 19:28:41,049 INFO o.a.j.m.J.JSR223 变量: 1003
2020-07-19 19:28:41,052 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-3
2020-07-19 19:28:41,052 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-3
- 公众号FunTester首发,更多原创文章:FunTester420+原创文章,欢迎关注、交流,禁止第三方擅自转载。
- 熔断器 Hystrix 源码解析 —— 命令执行(一)之正常执行逻辑
- 智能主题检测与无监督机器学习:识别颜色教程
- 如何下载安装Weka机器学习工作平台
- Dubbo 源码解析 —— LoadBalance
- 如何处理机器学习中类的不平衡问题
- 【死磕Java并发】—– Java内存模型之重排序
- Mask R-CNN源代码终于来了,还有它背后的物体检测平台
- 37个TOP实例命令,超过一半你肯定都没见过
- 利用TensorFlow生成图像标题
- 保存并加载您的Keras深度学习模型
- 简单、通用的JQuery Tab实现
- Dubbo源码解析 - 远程暴露
- 使用FastText(Facebook的NLP库)进行文本分类和word representatio...
- 声音分类的迁移学习
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【腾讯】在前端开发中,如何获取浏览器的唯一标识
- 如何实现表格单双行条纹样式
- Angular 容易忽略的知识点
- 语雀自动同步到hexo博客
- 推荐 3 款超好用的 Docker 图形化管理工具
- python标准库之glob介绍
- Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
- 使用List中的remove方法遇到的坑,不信你没有踩过!
- python opencv 图像尺寸变换
- OpenCv保存图像
- 机器学习|KNN
- docker 查看容器日志
- consul配置ACL
- CentOS7.5更改python版本后及yum不能用的解决办法,非编译!
- nginx 配置websocket