线程组

问题的提出,我们经常会有几项的任务,这几项任务之间本身没有先后顺序关系,或者是协作来共同完成一个目标。这个时候,我们就希望能够把这几项任务并行进行运行以充分利用CPU,缩短运行时间,或者把大的任务分成小的任务,所有的小任务都完成时,再继续进行下一阶段的处理。  
这个时候就有一个问题了,因为一般的Java多线程都是互不相关的,也就是当这个任务在执行的时候,主线程也会执行,但是因为这个时候前面的任务还不一定执行完毕,所以,主线程继续向下执行是有问题的,因此我们就要主线程等待这些线程执行完毕后再向下执行。  
为此,封装了一个线程组的概念,一个线程组内可以包含N个线程,所有的线程运行完毕后,线程组才会结束,调用线程组的线程才会继续向下执行。  
首先看示例:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class NumberAdd extends AbstractProcessor {
    public static int sumValue;
    private static Object lockObject = new Object();

    public NumberAdd(String name) {
        super(name);
    }

    @Override
    protected void action() throws Exception {
        for (int i = 0; i < 1000; i++) {
            add();
            Thread.sleep(1);
        }
    }

    private static void add() {
        synchronized (lockObject) {
            sumValue++;
        }
    }
}


上面的程序是一个类,它用于把sumValue中的值增加1000。  
下面是测试用例  

1
2
3
4
5
6
7
8
9
10
11
public void testStart() {
        MultiThreadProcessor processors = new MultiThreadProcessor("number add");
        for (int i = 0; i < 10; i++) {
            processors.addProcessor(new NumberAdd("add" + i));
        }
        long startTime = System.currentTimeMillis();
        processors.start();
        long endTime = System.currentTimeMillis();
        logger.log(LogLevel.INFO, "执行时间:{}", endTime - startTime);
        assertEquals(10000, NumberAdd.sumValue);
    }


启动了10个线程来执行添加操作,因为每个线程添加1000,最终应该是添加30000才对。  
最终的执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-0    [main] INFO   - 线程组<number add>运行开始,线程数10...
-5    [number add-add0] INFO   - 线程<number add-add0>运行开始...
-6    [number add-add4] INFO   - 线程<number add-add4>运行开始...
-6    [number add-add3] INFO   - 线程<number add-add3>运行开始...
-6    [number add-add1] INFO   - 线程<number add-add1>运行开始...
-6    [number add-add2] INFO   - 线程<number add-add2>运行开始...
-6    [number add-add7] INFO   - 线程<number add-add7>运行开始...
-7    [number add-add8] INFO   - 线程<number add-add8>运行开始...
-7    [number add-add5] INFO   - 线程<number add-add5>运行开始...
-7    [number add-add6] INFO   - 线程<number add-add6>运行开始...
-7    [number add-add9] INFO   - 线程<number add-add9>运行开始...
-1023 [number add-add6] INFO   - 线程<number add-add6>运行结束
-1023 [number add-add1] INFO   - 线程<number add-add1>运行结束
-1024 [number add-add9] INFO   - 线程<number add-add9>运行结束
-1024 [number add-add2] INFO   - 线程<number add-add2>运行结束
-1025 [number add-add5] INFO   - 线程<number add-add5>运行结束
-1029 [number add-add7] INFO   - 线程<number add-add7>运行结束
-1029 [number add-add4] INFO   - 线程<number add-add4>运行结束
-1030 [number add-add0] INFO   - 线程<number add-add0>运行结束
-1030 [number add-add3] INFO   - 线程<number add-add3>运行结束
-1031 [number add-add8] INFO   - 线程<number add-add8>运行结束
-1031 [main] INFO   - 线程组<number add>运行结束, 用时:1026ms
-1032 [main] INFO   -


并且测试用例也执行通过,说明最终的结果,确实是加了30000次。  
而且是在线程组执行完毕后,才执行的assertEquals语句。  
从此,写多线程协作就像写普通程序一样了。(注意是像,不是是,因为还是要注意冲突对象的同步问题的)  
### JMeter 线程组的配置与使用方法 JMeter 的线程组是性能测试的核心组件之一,它定义了如何模拟用户负载以及请求发送的方式。以下是关于 JMeter 线程组配置和使用的详细介绍: #### 1. 基本概念 JMeter 线程组是一个测试计划的基础单元,所有其他元件都需要嵌套在至少一个线程组中运行。每个线程代表一个虚拟用户,这些线程可以并行执行任务[^1]。 #### 2. 主要参数说明 以下是一些常见的线程组参数及其作用: - **Number of Threads (users)**:表示需要模拟的用户数量,即并发线程的数量。 - **Ramp-Up Period (in seconds)**:指启动全部线程所需的时间间隔(以秒为单位)。例如,如果有 10 个线程,并且 Ramp-Up 时间设为 10 秒,则每秒钟会启动一个新的线程[^3]。 - **Loop Count**:控制每个线程重复执行采样器操作的次数。如果设置为无限循环 (`Forever`) 或者勾选 `Scheduler` 并设定结束时间,则可以根据需求灵活调整测试持续周期[^2]。 #### 3. 进阶功能——自定义线程组 为了更精确地控制流量模式,可以通过安装插件扩展标准线程组的功能。比如 Custom Thread Groups 提供多种预定义模板来实现复杂的业务逻辑仿真,像阶梯型增长、脉冲波形等特殊场景下的压力施加方式都可以轻松完成配置。 #### 4. 同步定时器的应用 当涉及到某些特定情况下需让多个请求同时发生时,可利用 Synchronizing Timer 来协调不同线程之间的行为动作。需要注意的是,在实际应用过程中应合理规划其相关属性值以免造成不必要的延迟或者资源浪费现象出现。例如,“超时时间”的计算公式可以帮助确定合适的等待上限[^4]: \[ \text{超时时间} > (\text{请求集合数量} * 1000) / (\text{线程数} / \text{线程加载时间}) \] ```python # 示例 Python 计算脚本用于估算同步定时器的最佳超时时间 def calculate_timeout(requests, threads, ramp_up): thread_load_time = ramp_up / threads timeout_ms = requests * 1000 / (threads / thread_load_time) return int(timeout_ms) requests_count = 50 thread_number = 100 rampup_period_seconds = 60 optimal_timeout = calculate_timeout(requests_count, thread_number, rampup_period_seconds) print(f"Optimal Timeout Value: {optimal_timeout} ms") ``` 以上代码片段展示了如何依据给定条件动态得出推荐的同步定时器超时数值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值