线程组

Jmeter 配置说明之线程组 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组:通俗理解:· 线程组:就是一个线程组,里面有若干个请求;· 线程:一个线程就是一个“虚拟用户”;· 请求:一个线程组里面有若干个请求。对应关系:例如:1个线程组里面有10个请求,线程数为10个,跑完后得到:理解为:(10个线程数)10个人,每个人都要跑这10个请求,所以:10*10=100:并发数:100;线程数:10;PS:线程组也可以看作是一个虚拟用户组。 阅读详情

线程组的核心在于方便批量管理同一类线程,定义线程的共性行为。比如某个线程出现异常,则中断该组中所有线程。

推荐博文 https://www.cnblogs.com/noteless/p/10354721.html#

1. 私有的无参构造方法会构造一个system线程组,也被称之为根线程组。该方法由C代码调用

   /**
     * Creates an empty Thread group that is not in any Thread group.
     * This method is used to create the system Thread group.
     */
    private ThreadGroup() {     // called from C code
        this.name = "system";
        this.maxPriority = Thread.MAX_PRIORITY;
        this.parent = null;
    }

1. 从构造方法上来看,每个线程组(非system)必定有它的父线程组,不指定的话,默认为当前线程所属的线程组  Thread.currentThread().getThreadGroup()

public ThreadGroup(String name) {
    this(Thread.currentThread().getThreadGroup(), name);
}

public ThreadGroup(ThreadGroup parent, String name) {
    this(checkParentAccess(parent), parent, name);
}

private ThreadGroup(Void unused, ThreadGroup parent, String name) {
    this.name = name;
    this.maxPriority = parent.maxPriority;
    this.daemon = parent.daemon;
    this.vmAllowSuspension = parent.vmAllowSuspension;
    this.parent = parent;
    parent.add(this);
}

 

2. 从线程Thread的核心构造方法来看,如果线程在创建时不指定所属线程组,默认为父线程(姑且称之)所属的线程组,但是要注意的是,这里只是指定了父线程组,至于线程组中用来记录并存储组中线程的容器数组 Thread threads[] 并未加入该线程,仅当线程调用start方法并成功启动后,才算真正加入。

联系Thread中的方法可知,

3. 有关线程组的枚举方法,虽然没用过,这里简单分析一下枚举线程组中的线程,枚举子线程组的方法与其类似,跳过

/**
 * 参数list,一个用来装线程对象的数组容器,方法调用者自己传入,通常为一个空容器
 * 参数recurse,是否递归取得所有子孙组中的线程对象,默认为true
 * 参数n,调用者无法传入,公有的enumerate方法中未设置该参数,默认为0,在递归时被赋值,保证放入的线程对象不超出list长度
 */    
private int enumerate(Thread list[], int n, boolean recurse) {
        int ngroupsSnapshot = 0;
        ThreadGroup[] groupsSnapshot = null;
        synchronized (this) {
            if (destroyed) {
                return 0;
            }
            // nthreads表示该组中的所有线程数
            int nt = nthreads;
            // nt值受容器大小影响
            if (nt > list.length - n) {
                nt = list.length - n;
            }
            // 这里即将本组中的线程对象放入容器中
            for (int i = 0; i < nt; i++) {
                // 只保存alive状态的
                if (threads[i].isAlive()) {
                    list[n++] = threads[i];
                }
            }
            // 如果递归的话,
            if (recurse) {
                // 子线程组的数量
                ngroupsSnapshot = ngroups;
                // 做一次拷贝
                if (groups != null) {
                    groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);
                } else {
                    groupsSnapshot = null;
                }
            }
        }
        // 递归重复以上步骤
        if (recurse) {
            for (int i = 0 ; i < ngroupsSnapshot ; i++) {
                n = groupsSnapshot[i].enumerate(list, n, true);
            }
        }
        // 返回实际放入list中的线程对象数目
        return n;
    }

另外附上一个自己写的测试demo

package thread;

/**
 * @author LiFeng
 * @create 2019-11-04 上午 8:45
 * @describe
 */
public class TestThreadGroup {
	public static void main(String[] args) {
		Runnable target = new Runnable() {
			@Override
			public void run() {
				try {
					// 这里让线程休眠5s,避免线程执行完退出,保证main先执行完,不然结果可能不符合预期
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		// 不指定父线程组,则默认父线程组为当前线程组,即main线程组
		ThreadGroup mytg1 = new ThreadGroup("main-my-tg1");
		// 指定 mytg1 为父线程组
		ThreadGroup mytg2 = new ThreadGroup(mytg1, "main-my-tg1-tg2");

		// 该方法返回当前线程组所有子、孙线程组的总个数,注意,这是一个估计值,因为其内部结构可能会动态改变。该方法主要用于测试与监控
		int activeGroupCount = Thread.currentThread().getThreadGroup().activeGroupCount();

		// 初始化容器,预期容量同activeGroupCount
		ThreadGroup[] tgarr = new ThreadGroup[activeGroupCount];
		// 默认递归方式,取得所有子孙线程组
		int enumerate = Thread.currentThread().getThreadGroup().enumerate(tgarr);
		for (int i = 0; i < enumerate; i++) {
			System.out.println(tgarr[i].getName());
		}

		System.out.println("-------------------------------------");

		// 非递归方式
		ThreadGroup[] tgarr2 = new ThreadGroup[activeGroupCount];
		int enumerate2 = Thread.currentThread().getThreadGroup().enumerate(tgarr2, false);
		for (int i = 0; i < enumerate2; i++) {
			System.out.println(tgarr2[i].getName());
		}

		System.out.println("-------------------------------------");

		Thread a = new Thread(target, "main-a");
		Thread b = new Thread(mytg1, target, "main-mytg1-b");
		Thread c = new Thread(mytg2, target, "main-mytg1-mytg2-c");

		// 注意,这里必须启动才算真正加入线程组中
		a.start();
		b.start();
		c.start();

		// 类似上面的activeGroupCount方法,不介绍了
		int activeCount = Thread.currentThread().getThreadGroup().activeCount();

		Thread[] tarr = new Thread[activeCount];
		int enumerate3 = Thread.currentThread().getThreadGroup().enumerate(tarr);
		for (int i = 0; i < enumerate3; i++) {
			System.out.println(tarr[i].getName());
		}

		System.out.println("-------------------------------------");

		Thread[] tarr2 = new Thread[activeCount];
		int enumerate4 = Thread.currentThread().getThreadGroup().enumerate(tarr2, false);
		for (int i = 0; i < enumerate4; i++) {
			System.out.println(tarr2[i].getName());
		}


		System.out.println();

	}
}

输出结果如下:

结果是符合预期的,只是多了一些额外的东西~~,这个Monitor Ctrl-Break 线程是跟随main线程一起运行起来的,具体的不了解,不做深究。自行Google。

好了,我暂时真的不想在这个东西上花太多时间,有机会再深入。

Jmeter线程组使用详解 以下罗列的是Jmeter 所有线程组的详解,包括官方自带的线程组,和官方插件的线程组。官方线程组安装,详见之前的文章: https://blog.youkuaiyun.com/qq_36873975/article/details/103802114 本文详细介绍了 官方插件的持续加压线程组的使用。 jmeter阶梯加压详解。jmeter阶梯加压实战。 1. 官方插件 阶梯加压线程组1—bzm - Arri... 阅读详情

相关推荐

Jmeter(十二):jmeter的线程组元件&amp;第三方插件的线程组压力和负载线程_teardown线程组

*This group will start “Max” threads:**达到多少个并发,比如需求是达到100个并发 后持续加压,这里就是100,也就是并发的最高点;**First,wait for “N” seconds:**启动第一个线程之前,需要等待N秒,如果这里是0, 表示不等待,直接启动;**Then start “N” threads:**设置最开始时启动N个线程,一开始启动多少个线程,如 开始启动30个线程;

2401_89693875的博客 975

性能测试学习之路(四)—Jmeter之线程组详解

Jmeter常用线程组详解

qq_22007469的博客 6781

JMETER 线程组

JMETER 线程组 性能测试过程中间需要模拟虚拟用户进行并发操作,JMETER中间的线程组就相当于虚拟用户,同一个测试计划中间可以有多个线程组,线程组是JMETER 起点。下面对线程组各属性进行讲解。 线程组名称可以根据自己...

m0_37449634的博客 7146

线程组 Thread Group

线程组是 Java 中的一个概念,用于管理线程集合。一个线程组可以包含线程,并且可以是另一个线程组的子项。线程组形成的是一个树状结构,除了系统线程组(根线程组)之外,每个线程组都有一个父线程组。线程可以访问一些有关自己所属线程组的信息,比如线程组的名称,以及线程组中活动线程的数目等。

m0_62943934的博客 2502

从零差、外差到内差:一文读懂激光雷达中的相干探测原理

本文深入解析激光雷达中的相干探测原理,重点比较零差、外差与内差检测的技术特点与应用场景。通过实际工程案例,揭示相移测距中的相位解调技巧和FMCW激光雷达的外差奥秘,并提供光电探测器选型与光学组件匹配的实用建议,帮助开发者规避常见陷阱,提升系统性能。

weixin_42652674的博客 413

亚博k210视觉模块与stm32双向通信

【代码】亚博k210视觉模块与stm32双向通信。

w_150831的博客 3246

多线程——线程组

ThreadGroup 线程组:就是一组线程或者线程组,可以包含线程,也可以包含线程组,相信这个很好理解。 如下图:我可将这种关系,理解为父线程组,子线程组,线程。就像一棵树,本文会将末端的线程组成为“叶子节点” 1、线程对象关联: 1.1、1级关联 就是线程组中全部是线程,没有线程组,这样往下就没有可延伸的了,所以叫1级关联。 2.2、多级关联 就是线程组中...

dgh112233的博客 658

CANdb++ Editor实战:5步搞定DBC文件信号布局与字节对齐(附常见错误排查)

本文详细介绍了使用CANdb++ Editor进行DBC文件信号布局与字节对齐的实战方法。通过五步法,深入解析Intel与Motorola字节序差异、跨字节信号布局规则,并借助Layout视图等工具,帮助工程师高效解决信号错位、数据解析错误等常见问题,确保CAN网络通信的准确性与可靠性。

solidity8miner的博客 695

线程组概念

Java 线程组的相关概念

今天有划水吗? 723

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

如图所示,用红线圈出的两条头文件引用会报错,提示无法找到他们,但是可以发现的是,他们的路径书写是没有问题的。在终端中运行时候,会出现如下的报错。

GFCLJY的博客 1008

超越音频!STM32 SAI接口在AD7768高速ADC采集中的妙用(含PCB布局指南)

本文深入探讨了如何将STM32的SAI接口应用于AD7768高速ADC的数据采集系统,超越了其传统的音频应用范畴。文章详细解析了SAI协议与ADC时序的匹配方法,提供了从CubeMX配置、DMA数据搬运到关键PCB布局指南的完整实战方案,旨在帮助工程师实现稳定、高精度的工业级高速数据采集。

efc12345678的博客 305

【Java 基础篇】Java线程组详解

线程组是一个用于组织和管理线程的对象。它可以包含多个线程,将它们组织成一个单元,从而更容易进行管理和控制。线程组有助于将相关线程分组,便于监视和协调它们的行为。组织:将相似或相关的线程放在同一个组内,便于管理。控制:可以对整个线程组执行操作,如挂起、恢复、中断等。监视:可以获取线程组的状态信息,如活动线程数、线程组名称等。安全性:线程组可以用于设置安全性策略,限制组内线程的权限。当涉及到 Java 线程组时,一个常见的应用是将相关任务或线程组织成一个单元,以便更好地管理和监视它们的行为。

繁依Fanyi的博客 1400

微信小程序测试号开发后上传按钮灰色?三步快速切换正式AppID

本文详细解析了微信小程序测试号开发后上传按钮灰色的原因,并提供了三步快速切换正式AppID的解决方案。通过注册正式小程序账号、修改项目配置和重新编译上传,开发者可以轻松解决上传按钮不可用的问题,确保小程序顺利上线。

weixin_29291185的博客 1578

jmeter线程组设置

1、取样器错误后要执行的动作: 继续:忽略错误,继续执行 Start Next Thread Loop: 忽略错误,线程当前循环终止,执行下一个循环。 停止线程:当前线程停止执行,不影响其他线程正常执行。 停止测试:整个测试会在所有当前正在执行的线程执行完毕后停止 Stop test now:整个测试会立即停止执行,当前正在执行的取样器可能会被中断。 这几个配置项控制了“当遇到错误的时候测试的执行策略”是否会继续执行。 2、设置线程数: 线程数也就是并发数,每个线程将会完全独立的运行测试计划,互不干扰。多.

nieyayun2019的博客 1万+

FPGA 学习笔记:Vivado 工程更改FPGA 型号

FPGA 学习笔记:Vivado 工程更改FPGA 型号

坚韧与专注 1万+

uniapp - 热更新提示:WGT安装包中manifest.json文件不存在 | unexpected EOF!报错详细解决,完美搞定WGT安装包中WWW目录下manifest.json不存在问题

uniapp,安卓android,苹果ios,热更新,热更新code:-1202报错,,WGT热更新报错,uniapp热更新wgt出现报错manifest.json文件不存,uniapp安卓苹果软件热更新时出现错误unexpected EOF!如何解决,怎么解决热更新wgt报错,app新版本下载安装报错WGT安装包中manifest.json文件不存在,WGT安装包中WWW目录下manifest.json不存在,uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误,uniapp-wgt

✅ 精选推荐文章 1万+

Java 线程组

线程组:可以有线程对象,也可以有线程组。(ThreadGroup) 线程组的作用是,可以批量的管理线程或线程组对象,有有效地对线程或线程组对象进行组织。 官方文档:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ThreadGroup.html 线程对象关联线程组:1级关联。介绍: 1级关联就是父对象中有...

抛弃幻想,准备斗争 2349

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jmeter组件---线程组

Jmeter组件---线程组

paidaxing_dashu的博客 3209

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JMeter 线程组(Thread Group )

JMeter线程组(Thread Group)

weixin_62996829的博客 3702

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[4] JMeter-详解jmeter线程组

1 今日主题:详解jmeter线程组 本文内容基于 jmeter 3.0 版本。 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程下。所有的任务都是基于线程组。   一、Threads (Users)线程 用户 上图可以看到,jmeter有三个添加线程组的选项,名字不一样, 但是创建之后,其界面是完全一样的。 1、 setup thread g...

媛测 3万+

Jmeter线程组-(上篇)

需要注意的是,循环次数设置得太高,特别设置循环次数为永远,可能会导致测试机器资源不足,影响测试结果的准确性;这种设置对于测试场景中的稳定性和可靠性非常重要,特别是在模拟并发用户或大负载情况下,能够及时发现问题并停止测试,有助于减少潜在的影响和损害。在JMeter的线程组配置中,你可以根据你的需求来设置线程数,通常是根据你想要模拟的用户负载量和你的系统资源来决定的。在JMeter的线程组配置中,你可以根据你的需求来设置循环次数,通常是根据你想要模拟的用户访问上限值,如抽奖次数。

朱雀随云记的博客 1841

Java线程组ThreadGroup

1 简介 线程组(ThreadGroup)是一个线程集合。是为了更方便地管理线程。线程组是父子结构的,一个线程组可以集成其他线程组,同时也可以拥有其他子线程组。从结构上看,线程组是一个树形结构,每个线程都隶属于一个线程组,线程组又有父线程组,这样追溯下去,可以追溯到一个根线程组——System线程组。 2 线程组树的结构 JVM创建的system线程组是用来处理JVM的系统任务的线程组,例如对象...

JavaEdge全是干货的技术号 3074

Jmeter各类线程组详解

Jmeter各类线程组详解 作者:牛刘源 了解JMeter的朋友都知道,它不仅能做简单的接口测试、还支持性能测试,接口类型不仅支持Rest、SOAP,也可扩展WebSocket、Socket等。无论你用Jmeter做哪种测试,哪种接口类型,哪种网络协议,你都必须添加使用Jmeter线程组,线程组在Jmeter中占据主导地位,它是任何一个测试计划的起点,所有的逻辑控制器、采样器、处理器、报告等都...

张康康 1663

jmeter一个线程组多个请求_jmeter 线程组

jmeter 线程组1.1 线程组线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等等配置。例如,如果你设置线程数为 100,那么 jmeter 将创建并模拟测试 100 个用户请求到服务器端。如下图所示:5.3.1 添加线程组添加线程组的步骤...

weixin_39616071的博客 3161

07.Jmeter线程组概述

JMeter线程组,JMeter线程组设置,JMeter抓包,JMeter运行,JMeter线程组并行和串行运行,JMeter线程抢占资源

2081
上一篇: 深入理解java异常处理机制
下一篇: 多线程下的异常捕获
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值