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

Part1 线程与多线程概念

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

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

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

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

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

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

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

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

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 tothe 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 进行同步。

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

java 多线程压测_java多线程Jmeter压测实现相关推荐

  1. JAVA读取jtl文件不完整,Jmeter压测之jtl文件解析

    一.背景 最近在做性能压测方面的工作,用的压测工具是Jmeter.Jmeter中有一个插件叫 jp@gc Throughput Shaping Timer.翻译过来就是吞吐量整形定时器.如下图: Th ...

  2. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  3. linux压测接口工具,jmeter压测工具

    一.目录文件讲解 目录 bin:核心可执行文件,包含配置 mac/linux:使用jmeter启动 windows:使用jmeter.bat启动 jmeter-server:mac/linux分布式压 ...

  4. java读取zip文件名_java无需解压zip压缩包直接读取包内的文件名(含中文)

    java自带了java.util.zip工具可以实现在不解压zip压缩包的情况下读取包内文件的文件名:(注:只能是ZIP格式的,rar我试了不行)代码如下: public static String ...

  5. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  6. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  7. java 解压文件_java实现解压zip文件,(亲测可用)!!!!!!

    项目结构: Util.java内容: package com.cfets.demo; import java.io.File; import java.io.FileOutputStream; imp ...

  8. java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  9. java 多线程下载图片_java多线程实现下载图片并压缩

    最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地址文件中包含4000个地址左右,也就是说一个文件扫描后需要下 ...

最新文章

  1. c++ vector简单使用
  2. 数据持久化 技术比较
  3. 【AS3代码】隐藏原有鼠标箭头,并自定义鼠标小箭头
  4. 授以渔 - Autodesk Forge 学习简谈 - 引言
  5. 关于MySQL的各种总结
  6. mysql dts_云树·DTS - 产品系列 - 分布式数据库系统_MySQL数据库性能优化-爱可生...
  7. 一个网卡绑定多个IP
  8. 测试面试题集-Python三局两胜小游戏
  9. 获取aplicationContext对象,从而获取任何注入的对象
  10. bat批量剪切命令_批量处理文件.bat命令手册
  11. Java反序列化漏洞之殇
  12. jsBarcode生成条形码
  13. 易优EyouCMS全套插件使用说明
  14. qlv格式转换成mp4 视频格式转换
  15. Could not find a declaration file for module ‘xxx‘. ‘xxx‘ implicitly has an ‘any‘ type.
  16. 从MySQL中读取股票数据——从零到实盘10
  17. 帷幕的帷是什么意思_人为什么要结婚?看看情感大师是怎么说的
  18. 《时令绝杀技——向上汇报》
  19. 百度SEO核心优化之关键词相关匹配
  20. AD7190之STM32程序

热门文章

  1. Python学习之旅:使用virtualenv创建Python环境及PyQT5环境配置
  2. Kotlin——初级篇(一):最详细的环境搭建
  3. c#中关于delegate、委托、事件之间的联系、关系
  4. 【转】解决XMLHTTP获取网页中文乱码问题
  5. HttpHandler和HttpModule 心得介绍
  6. leetcode 92 python
  7. 为什么说“进程是资源分配的单位、线程是调度的单位”?
  8. C语言-附加-给一个数求最大质数(完整代码)
  9. C语言--学生管理系统--(完整代码)
  10. 2021年4月Oracle数据库补丁分析报告