模拟并发的 4 种方式,还有谁不会??(2)

简介: 模拟并发的 4 种方式,还有谁不会??(2)

三、并发模拟工具JMeter


JMeter也是一款性能测试工具,是图形化的。下载地址:传送门 http://jmeter.apache.org/


25.png


需要 Java8+ 的环境


26.png


解压到你觉得合适的目录下(注意最好是英文路径),进入它的 bin 目录下 启动 jmeter.bat 即可。


image.png


使用很简单,首先在测试计划部分新建一个线程组


28.png29.png30.png


设置好基础信息后添加HTTP请求(基本信息设置好没有OK哈,直接添加HTTP请求)


31.png


填写HTTP请求相关的内容


32.png


之后还要添加监听器,这里选择是图形结果


33.png


再添加一个查看结果树吧


34.png


在运行之前打开log Viewer


35.png


下面开始运行:


36.png


执行成功,来感受一下结果:


37.png


点进去


38.png


查看结果树


39.png


四、代码模拟


这里需要用到一个类,就是 CountDownLatch。CountDownLatch 是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。


更多多线程教程可以参考:https://www.javastack.cn/categories/Java/


CountDownLatch 用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用 countDown 方法使当前计数器的值变为零,每次调用 countDown 计数器的值减1。


当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。下图和它的方法可以体现出来:


40.png


CountDownLatch类只提供了一个构造器:


public CountDownLatch(int count) { };

然后下面这 3 个方法是 CountDownLatch 类中最重要的方法(上图能够反映出来)


public void await() throws InterruptedException { };
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
public void countDown() { };


下面还需要看一个类 Semaphore


Semaphore 与 CountDownLatch 相似,不同的地方在于 Semaphore 的值被获取到后是可以释放的,并不像 CountDownLatch 那样一直减到底。


它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有N个线程可以访问,那么超过N个主不允许再有线程来访问,同时当现有线程结束后,就会释放,然后允许新的线程进来。有点类似于锁的lock与 unlock过程。相对来说他也有两个主要的方法:


用于获取权限的acquire(),其底层实现与CountDownLatch.countdown()类似;用于释放权限的release(),其底层实现与acquire()是一个互逆的过程。


通过这两个类可以进行并发的模拟:


测试一下:


import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
@Slf4j
public class CuncurrencyTest {
    public static int clientTotal = 5000;
    public static int threadTotal = 200;
    public static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    add();
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    log.error("exception",e);
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        log.info("count:{}",count);
    }
    private static void  add() {
        count++;
    }
}


因为 count 不是线程安全的,且没有作防护措施,结果是错的


41.png


上面是对代码的并发模拟的简单形式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用途很广泛,等之后更新Java网络编程的东西的时候,还会详细介绍它们。


相关文章
|
人工智能 自然语言处理 算法
谷歌推出”自我发现“框架,极大增强GPT-4等大模型推理能力
【4月更文挑战第20天】谷歌DeepMind团队推出了SELF-DISCOVER框架,让大型语言模型能自我发现并构建推理结构,提升在复杂任务中的性能。该框架模仿人类解决问题方式,分两阶段选择和适应原子推理模块,以解决挑战。在多任务测试中,SELF-DISCOVER相比传统方法表现出色,性能提升42%,计算量减少10至40倍。它具有跨模型应用的普适性,并与人类思维方式相通。然而,它在某些任务类型上仍有优化空间,且需解决计算成本问题。论文链接:https://arxiv.org/abs/2402.03620
264 1
|
4月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
204 0
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
8月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
监控 前端开发 关系型数据库
【Zabbix_6.x 第二章】部署新版 Zabbix-6.0 TLS,你该了解了解(下)
【Zabbix_6.x 第二章】部署新版 Zabbix-6.0 TLS,你该了解了解(下)
483 0
|
JSON 测试技术 Apache
解决 JMeter 返回内容中文乱码问题的详细指南
在Apache JMeter性能测试中,遇到中文乱码问题会影响测试效果和报告理解。解决方法包括:1) 修改`jmeter.properties`配置文件,将`sampleresult.default.encoding`设为UTF-8;2) 在HTTP请求中指定`Content-Encoding`为UTF-8,确保请求和响应编码一致;3) 使用后置处理器如JSR223处理响应数据编码;4) CSV数据文件保存为UTF-8并在JMeter中配置相应编码;5) 添加HTTP Header Manager设置`Content-Type`。
|
网络协议 算法 Java
04SpringCloud 之 Consul 简介
04SpringCloud 之 Consul 简介
385 0
|
Web App开发 Unix 测试技术
什么是兼容性测试?
什么是兼容性测试?
547 0
|
存储 测试技术 Apache
高效管理JMeter中的Cookies:测试工程师的全面指南
Apache JMeter的Cookie管理器是性能测试中的关键工具,用于模拟用户会话和保持状态。本文档详细介绍了如何配置和使用Cookie管理器:添加HTTP Cookie Manager到测试计划,配置清除每次迭代Cookies的选项,以及设置登录和验证请求。此外,还讨论了验证、调试、进阶配置,如Cookie政策、跨域Cookies和正则表达式提取Cookie。通过掌握这些步骤,可以提升测试的准确性和效率。
|
XML Android开发 UED
Android动画之共享元素动画简单实践
本文介绍Android共享元素动画, 实现两Activity间平滑过渡特定UI元素。通过设置`transitionName`属性和使用`ActivityOptions.makeSceneTransitionAnimation`启动目标Activity实现动画效果。可自定义过渡动画提升体验。
352 0
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)
MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)
1573 0