Java 多线程编程在 JMeter 中应用

news2024/11/26 2:48:39

目录

前言:

首先新建一个简单的线程组和一个简单的请求:

添加 JSR223 预处理程序(后置处理程序需要下一次次请求)

可以通过复制私有变量来控制所有线程获取公共变量时的线程安全问题。

日志输出:


前言:

Java多线程编程在JMeter中的应用可以帮助模拟并发用户对系统进行性能测试。JMeter本身就是基于Java开发的,因此可以利用Java多线程编程的能力来实现并发请求。

在最近的工作中,遇到一个需求:在JMeter中生成一个全局唯一变量,获取一次自增 x(这个不确定,可能根据响应信息)。这不是我的需求,只是从同事那边听说到的,周末没事儿想起来这个事儿。按照我的方案肯定是用Java或者Groovy去实现这个需求,肯定不会选JMeter

如果非要给这个需求加一个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中的对象propsJVM里面是有缓存的,经过我多次实验,只要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

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel VLOOKUP使用详解

VLOOKUP语法格式: VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) VLOOKUP(要查找的值,查找区域,要返回的结果在查找区域的第几列,精确匹配或近似匹配) 一、精确查找 根据姓名查找对应…

Jmeter之数据参数化方法汇总

一、什么是参数化 Jmeter参数化是指将脚本中的某些需要输入数据使用参数来代替,在脚本运行时指定参数的取值范围和规则。脚本在运行时就可以根据需要选取不同的参数值作为输入。 常用的Jmeter的参数化请求,包括以下几种方式: 用户参数用户…

Seata分布式事务失效场景

场景: Feign熔断降级;被调用服务全局异常捕获了; 解决方案: 将需要分布式事务的调用链异常一直往上抛出去; 参考:https://blog.csdn.net/qq_16468489/article/details/121798016手动开启全局事务并进行回…

观察者(Observer)模式

目录 使用场景参与者协作效果实现类图 观察者(Observer)又被称为 发布-订阅模式,是一种对象行为模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并自动更新。通知的发布者(目标&a…

校园跑腿小程序都包括哪些业务呢?

校园创业,大家都知道,一直以来是个非常火热的话题,每位步入大学校园的学子们都有过在校创业的想法,包括我们一些有着学校资源的社会创业者们,早已经看好了中国高校这块巨大的市场。 在这里,我要跟大家分享…

面向对象进阶二(包、final、权限修饰符、代码块、abstract、接口、内部类)

面向对象进阶二 一、包、final、权限修饰符、代码块1.1 包1.2 final关键字1.3 权限修饰符1.4 代码块1.4.1 局部代码块(已淘汰,了解)1.4.2 构造代码块(了解内容)1.4.3 静态代码块 二、抽象方法和抽象类三、接口3.1 接口…

解释 void 类型转换: (void)++y

谢谢大师们的指导,保存,分享

【LeetCode】HOT 100(23)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

JS语法学习实战系列

JS学习实战系列 一、数据类型二、运算符三、流程控制四、let 、var、 const 声明变量的区别 JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它…

电路维修(双端队列bfs)

题意:从左上角走到右下角,且只能走斜线,斜线可以旋转,旋转斜线那么走过这条线,那么距离就加1,求最小的距离。 分析:有一个性质,因为起点是偶数点(0,0),那么它只能走到偶数点&#x…

进程间通信-有名管道

理解&#xff1a;有名管道类似于文件io 相当于新建一个管道文件作为中间介质 进行数据的交换&#xff08;因此可以不同线程间通信&#xff09; 写入管道文件 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #…

菜鸡shader:L9 屏幕UV及屏幕UV扰动

文章目录 屏幕UV代码最后效果 屏幕UV扰动代码最后效果 屏幕UV 最主要的代码是屏幕UV的获取&#xff1a; 这里具体可以参考这位大佬的博客&#xff1a; 个人学习笔记——庄懂的技术美术入门课&#xff08;美术向&#xff09;17&#xff08;VS空间畸变矫正的原理&#xff09;个…

驱动程序设计 Linux设备驱动中的阻塞与非阻塞IO、信号与函数 7.12

linux设备驱动中的阻塞与非阻塞I/O 阻塞&#xff1a;等待某种资源&#xff0c;如果获取不到&#xff0c;就会把当前任务挂起&#xff0c;等待资源准备好 1. int flag 0; while(flag 0); 2.等待队列 wait_event(q,flag > 0); wakeup(q);非阻塞&#xff1a;等待某种资源非…

nodejs中使用Redis

安装教程&#xff1a;Redis 安装 | 菜鸟教程 redis下载链接&#xff1a;Release Redis for Windows 5.0.14.1 tporadowski/redis GitHub解压双击redis-server.exe启动服务器端双击redis-cil.exe启动客户端连接服务端在客户端看看能不能ping通 完成 遇到的问题1&#x…

前端处理后端返回的文件流,进行文件下载

二进制流格式 Blob格式 前言&#xff1a; 需求&#xff1a;根据后端接口返回的文件流进行数据处理&#xff0c;并实现文件的下载&#xff0c;且下载文件为word文档. 代码实现&#xff1a; //下载文件 async function DownLoadFile(row) {let res await DownLoadFileAPI(row.…

火山引擎 DataLeap 构建Data Catalog系统的实践(二):技术与产品概览

技术与产品概览 架构设计 元数据的接入 元数据接入支持T1和近实时两种方式 上游系统&#xff1a;包括各类存储系统&#xff08;比如Hive、 Clickhouse等&#xff09;和业务系统&#xff08;比如数据开发平台、数据质量平台等&#xff09; 中间层&#xff1a; ETL Bridge&#x…

PCL点云处理之最小二乘直线拟合(❤❤❤亲测可用❤❤❤)(二百)

PCL点云处理之最小二乘直线拟合(❤❤❤亲测可用❤❤❤)(二百) 一、算法介绍二、具体代码1.代码2.结果一、算法介绍 点云近似于直线分布,但相对要散乱一些,此时,最小二乘直线拟合,是一种最常用的拟合方法,可以从中找到最优的直线方程,用于描述点云的分布情况。网上介…

Yjmstr的算法竞赛模板(updating)

YJMSTR的算法竞赛模板 目录 文章目录 YJMSTR的算法竞赛模板目录图论一、最短路1.spfa与负环、最短路1.1 bfs-spfa找负环&#xff1a;1.2 dfs-spfa找负环1.3 spfa求最短路的优化 2.dijkstra模板&#xff08;set模拟二叉堆堆优化)2.1有向图最小环 3.Floyd求多源最短路/传递闭包/…

ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 cpu 内部 coresight 组件

文章目录 如下图所示&#xff0c;如果A78想去访问M33的内部 coresight 组件 ETM&#xff0c;需要要怎么做&#xff1f; 答案也正是在图中&#xff0c;首先A78 通过AXI 互联&#xff0c;接入到 APBIC 的 slave port&#xff0c;再通过APBIC 的 master 送出&#xff0c;而APBIC中…

【win11】将一个程序设置为开机启动

Windows 在 Windows 系统中&#xff0c;可以通过在 “启动” 文件夹中放置程序的快捷方式来实现开机启动。 按照以下步骤操作&#xff1a; 按 Win R 打开 “运行” 对话框&#xff0c;输入 shell:startup&#xff0c;然后按回车。这将打开 “启动” 文件夹。 找到你想设置…