java多线程&&Jmeter压测实现

笔者最近在看jmeter源码,对多线程处理部分的了解记录如下。

Part1 线程与多线程概念

提到线程先来看一下进程(线程的容器)的概念,进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

对于jmeter来说,运行中的jmeter程序实例便是一个进程。而该进程中会包含大量线程。

线程是程序执行流的最小单位,是一组命令的集合。在jmeter中一个线程可以用来执行一个测试用例。在起停等基本属性设置的基础上,线程运行时会根据testtree解析出的sample取样器按需执行流程中包含的测试请求。

不同的资料中对线程状态有不完全相同的描述,基本上分为五种状态:新建 开始(等待) 运行 挂起 和 停止。

在jmeter/压测宝中,需要有高并发性,大量的线程并行执行,其中每个线程代表一个VU。这就涉及到多线程的概念。

对于多线程,在java中有两种实现方式,即,一种是通过继承thread类;另一种是实现Runnable接口。由于java单继承机制,继承thread实现有更多的局限性,一般采用Runnable接口方式。同时,实现了Runnable接口的类,可以通过thread类构造方法public Thread(Runnable target) 来转化运行。

Jmeter中线程的实现也是采用了Runnable接口方式。

并发大量线程执行相同任务,需要统一管理配置多线程的状态,便需要引入线程组(threadgroup)的概念。

<Ps:实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。>

Part2:线程组

Java中有threadgroup的概念,ThreadGroup是一个类,它的目的是提供关于线程组的信息。ThreadGroup API比较薄弱,它并没有比Thread提供了更多的功能。它有两个主要的功能:一是获取线程组中处于活跃状态线程的列表;二是为线程设置捕获异常处理器。

而这薄弱的API不能满足JMeter的需求,所以JMeter是自定义的threadgroup类。用来实现对一组线程(也就是一个测试实例的并发线程)的管理。它针对线程组的各项属性,如线程的延时启动时间/开始时间/结束时间/线程总数/正在运行的线程数/线程启动时间间隔进行设置。当有线程延时启动时,先创建等量守护线程,由守护线程根据时间创建对应的用户线程并依次启动;没有延时启动时,直接创建用户线程并依次启动。

另外,线程组提供scheduleThread(This will schedule the time for the JMeterThread.),对线程启动进行时间安排;并能够控制线程的相关方法:启动 暂停 停止 等待停止线程, 获取活动的线程数等。

上面提到,实现runnable接口的方式适合多个相同的程序代码的线程去处理同一个资源。多线程共享资源便容易引起线程安全问题。

Part3:线程安全

线程安全问题产生原理:

线程的工作原理,jvm有一个main   memory,而每个线程有自己的working   memory,一个线程对一个variable进行操作时,都要在自己的working   memory里面建立一个copy,操作完之后再写入main   memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。

比如,两个线程同时为一个数组添加项,当前数组长度为0.两个线程同时对其操作,会分别在自己的工作内存中拷贝一份进行添加。两线程分别添加完返回,此时数组长度已经是2,但是每个线程返回的数组长度依然是1,这就引发了问题。

Jmeter中保证线程安全的方式:

一)在start方法执行之前定义好线程内部的变量;

Eg :

启动时间 终止时间等参数是通过第一种赋值,如下jmeter源码描述:

The following variables are set by StandardJMeterEngine.

This is done before start() is called, so the values will be published to the thread safely

线程的变量是在start方法执行之前,这样保证变量的作用范围仅限于线程内。

二)用volatile关键字来标识线程共用的变量(PS:当我们使用volatile关键字去修饰变量的时候,所以线程都会直接读取该变量并且不缓存它);

Eg:

线程共享的变量如running /onErrorStopTest等是采用volatile关键字。

三)通过synchronized同步代码块或方法体(PS:用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完  从mainmemory  load到workingmemory   ->   use&assign   ->   store到mainmemory   的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。);

Eg:

对于方法/代码块,如 static synchronized void incrNumberOfThreads()新增活动线程方法等,多线程共用的代码,需要用synchronized 进行同步。

笔者对多线程了解尚浅,文中不当之处敬请指正,万分感谢!

时间: 2024-10-07 08:30:02

java多线程&&Jmeter压测实现的相关文章

java编写jmeter压测脚本

目前项目中接触的比较多的是接口测试,功能测个差不多后会对部分接口进行压测,采用的是java编写脚本,导入jmeter进行压测. 使用到的jmeter的相关包 写一个测试类,继承AbstractJavaSamplerClient 设置请求参数,这些参数在导入进jmeter之后会在java请求页面显示出来 具体的请求方法可以写在test方法里,获取请求的结果resultData,然后对resultData里的内容解析,判断接口调用成功or失败 将项目导出成jar包,导入到jmeter中,在jmete

jmeter压测网站

1.Jmeter介绍 Jmeter是apache组织开发的基于java的压力测试工具. Jmeter可以用于对服务器.网络活对象模拟巨大的负载,来自不同压力类别下测试他们的强度和分析整体性能.另外,jmeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果.为了最大限度的灵活性,jmeter允许使用正则表达式创建断言. 2.Jmeter工作原理 image001 3.Jmeter安装 实验环境:系统:centos6.6 64位Java:1.8.0_65Jm

jmeter压测学习1-window环境准备与案例

前言 最近用jmeter做一些接口的压力测试,记录下使用过程中遇到的一些问题. 在使用window机器做并发压测的时候,发现并发数设置100的时候,会出现报错:java.net.SocketException: Socket operation on nonsocket: connect 环境准备: java 1.8 jmeter 5.1.1 jmeter环境 jmeter环境依赖JAVA环境,需安装JDK1.8环境,JDK环境安装网上一大堆教程,自己去想办法吧,我这里就不多说了. jmeter

jmeter压测app

使用代理的方式,录制app端脚本,之后用jmeter压测就没啥好说的了 1.电脑端谷歌设置本地代理(端口号为8888) 2.jmeter设置HTTP代理服务器(端口号为8888) 3.手机端wifi设置HTTP手动代理(服务器为电脑的IP,端口号为8888) 4.jmeter启动代理 5.手机端登陆使用app,jmeter录制到了脚本

jmeter压测

压测指标:TPS/QPS,响应时间 jmeter压测设置 jmeter压测结果监听器添加 jmeter压测结果查看(Samples:请求次数,Average:平均响应时间/ms,Throughput:TPS) jmeter加压力机(压力机之间能ping通) 各压力机下bin执行jmeter-server.bat,启动 修改jmeter.properties中remote_hosts参数添加压力机IP和端口(端口默认1099),示例如下 remote_hosts=localhost:1099,10

手把手教你jmeter压测--适合入门

[后台测试]手把手教你jmeter压测 我知道我迟早是要踏上了后台测试之路的,只是没想到来的这么突然.新接手了一个项目,在第一版发出后,产品需要做运营活动拉量,因为我担心突然的流量涌入是否会对后台造成压力呢?因此决定做一下压测: 下面就一步一步的介绍我从0到1的压测过程吧. 我下载的是 apache-jmeter-2.13,因为这个包下载下来通用linux和windows的,所以我们现在windows下打开它. 直接点击bat,打开jmeter: 添加一个线程组: 添加完成之后,先设置这两项:

jmeter压测、操作数据库、分布式linux下运行、webservice接口测试、charles抓包

一.jmeter压测 在线程组中设置好,然后添加http请求,t添加聚合报告查看压力测试结果,如图: 一般压测时间10-15分钟,如果是稳定性测试,一般n*12小时,这些并发用户一直在请求. tps:服务端每秒钟能处理的请求数. 响应时间:就是你从发出请求到服务端返回给你数据的时间. 二.jmeter操作数据库 在测试计划中添加mysql-connector-java-5.1.7-bin.jar 最后添加查看结果树.如果既要查询又要修改操作选择Callable Statement这个模式. 断言

Java秒杀实战 (四)JMeter压测

转自:https://blog.csdn.net/qq_41305266/article/details/81071278. 一.JMeter入门 下载链接 http://jmeter.apache.org/download_jmeter.cgi 添加线程组 设置http请求默认值 添加待压测的http请求 添加聚合报告监听器 启动测试 1000个线程,循环10次,即10000个请求 二.redis 压测 1. redis-benchmark -h 127.0.0.1 -p 6379  -c 1

Jmeter压测快速体验

前言 最近在看neo4j相关的官网文档以及一些调优参数,同时也学了下Jmeter,为了测试下neo4j服务的性能,虽然不是专业搞测试的,但是我觉得每个优秀的开发者都应该学会主动压测自己服务和代码的性能,并非写完代码之后直接扔给测试就完事了,兵法云:知彼知己,才能百胜不殆嘛. jmeter是什么 jmeter是一款开源的测试工具,源码100%基于Java并开源,最初的设计目的是用来测试Web应用的,由于其非常轻量级和免费,后来又扩展到其他测试领域. jmeter的一些特点: 1.能够对HTTP,F