别再写代码测试并发了,太 Low!模拟并发的 4 种方法,还有谁不会??
Posted Java技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了别再写代码测试并发了,太 Low!模拟并发的 4 种方法,还有谁不会??相关的知识,希望对你有一定的参考价值。
点击关注公众号,Java干货及时送达
一、Postman
Postman 是一个款 HTTP 请求模拟工具
![](https://image.cha138.com/20220602/3a6c317943e54ece9d7bfafdd69fbd3a.jpg)
首先演示一下 Postman 最基本的使用,创建一个 Spring Boot 项目,测试的代码如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("test")
public class TestConrtoller
@GetMapping("demo")
public String testDemo()
return "result~";
![](https://image.cha138.com/20220602/d2f8f535ec2a452b951387dc27e1d5b3.jpg)
为了便于操作,一般会将
http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境,点击右上角的设置图标
![](https://image.cha138.com/20220602/26821a114bd4473fb864f81512ab6df3.jpg)
选择 global
![](https://image.cha138.com/20220602/072b9f30b26e41689a792931169f5166.jpg)
输入信息
![](https://image.cha138.com/20220602/8fa770a077574519b470f975dac0baba.jpg)
以后再进行测试就能这样搞简写了
![](https://image.cha138.com/20220602/dd900276b9194e528f3a5cf2c09f0362.jpg)
知道基本使用之后,我们来看一下如何模拟并发测试,想成为架构师,这份架构师图谱建议看看,少走弯路。
![](https://image.cha138.com/20220602/dee099ee449c4772a5fd52d77ac69572.jpg)
填写基本信息后,创建:
![](https://image.cha138.com/20220602/252e5f43ad13450cb0bc586ed0cc3dbc.jpg)
这个时候会创建出Concurrency的文件夹,我们可以把刚才测试的demo的例子放进这个文件夹下:
![](https://image.cha138.com/20220602/4cc1fc2784df4888991ab8f184dd1630.jpg)
![](https://image.cha138.com/20220602/2df1e4c8b0a54dc297670bae2020fc5d.jpg)
这个时候就可以在Concurrency下看到这个接口测试了
![](https://image.cha138.com/20220602/45d172b393eb48e6aac559e5f766e543.jpg)
选择并发测试:
![](https://image.cha138.com/20220602/9729e10450f84529a65541a455c1f522.jpg)
这个时候弹出我们想要的框了
![](https://image.cha138.com/20220602/9dface409fd840a7a0c50c660e0a0911.jpg)
点击 Run Concurrency
你可以立马感觉到 CPU 在“燃烧”,因为要记录并打印日志,显示的话是一条一条来的,其实测试的速度,要比你看到的打印的日志的速度快,绿色表示正常
![](https://image.cha138.com/20220602/c96db05b9f7245bbbbffea9dfa80ddc8.jpg)
二、Apache Bench(AB)
ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。
ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。
使用的话,首先需要安装 Apache 服务器
网站:传送门 http://httpd.apache.org/download.cgi
因为我的操作系统是 windows10, 这里选择 File for Microsoft Windows
最新面试题整理好了,大家可以在Java面试库小程序在线刷题。
Linux下的安装是非常简单的,这里不再演示
![](https://image.cha138.com/20220602/b3ad0a38100f4255b74c353516a6e161.jpg)
选择 ApacheHaus
![](https://image.cha138.com/20220602/3476d89e5ece4b5fb419ce5d92f56d81.jpg)
进入下载页面 选择适合自己电脑的版本
![](https://image.cha138.com/20220602/59278ce12a374583b03acaf5a5979b85.jpg)
文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数,注意文件路径最好都是英文,关于需要设置参数,conf->httpd.conf 使用文本编辑器打开,需要修改的有三个地方:
![](https://image.cha138.com/20220602/81e5f76ddb074445b8ba09922fe43085.jpg)
![](https://image.cha138.com/20220602/a1dd961d22ba4058bd2be1739e6bccda.jpg)
运行根目录,修改成自己解压到本地的路径
点击关注公众号,Java干货及时送达
![](https://image.cha138.com/20220602/685097ed06b64f74b83b124af5f1843f.jpg)
监听端口,默认监听端口是80,如果已被使用会报错需要修改,如果80端口未被使用,可不修改;如果修改了监听端口,则需要把ServerName localhost也相应改成同样的端 口号
![](https://image.cha138.com/20220602/f0bf927aec244f5984b74ac68da4c740.jpg)
![](https://image.cha138.com/20220602/eec7dfa34a794f068c3ff54b1a6bde35.jpg)
DocumentRoot 测试文件存放地,且该目录必须存在
![](https://image.cha138.com/20220602/019851f144da4537ad9afb590f9b5047.jpg)
配置完成后,命令行cmd进入 D:\\softUtil\\Apache24\\bin 目录下
httpd.exe -k install
![](https://image.cha138.com/20220602/b770e09d8ac749c89035ae4015b7d68e.jpg)
启动:
httpd.exe -k start
测试:
-n :请求数 -c: 并发数
![](https://image.cha138.com/20220602/4af12d30e7ad48688a7a0993dae450e5.jpg)
三、并发模拟工具JMeter
JMeter也是一款性能测试工具,是图形化的。下载地址:传送门 http://jmeter.apache.org/
![](https://image.cha138.com/20220602/a600e8b7d9e6450db952c52389452140.jpg)
需要 Java8+ 的环境
![](https://image.cha138.com/20220602/5e7c7262a60a46259854232d8d71fb08.jpg)
解压到你觉得合适的目录下(注意最好是英文路径),进入它的 bin 目录下 启动 jmeter.bat 即可。想成为架构师,这份架构师图谱建议看看,少走弯路。
![](https://image.cha138.com/20220602/8127b1d3f9d54417ac787675075cb935.jpg)
使用很简单,首先在测试计划部分新建一个线程组
![](https://image.cha138.com/20220602/131ebec77df6481eacbae40a6696540e.jpg)
![](https://image.cha138.com/20220602/fcd7f833be56492bba3960325673261f.jpg)
![](https://image.cha138.com/20220602/dfb73782666c4ca8876e7c00052ac2e1.jpg)
设置好基础信息后添加HTTP请求(基本信息设置好没有OK哈,直接添加HTTP请求)
![](https://image.cha138.com/20220602/328fbd683b4a4a96b5e244db2055d61a.jpg)
填写HTTP请求相关的内容
![](https://image.cha138.com/20220602/c5008dd0a9af4fdba390b3abd6cb0d30.jpg)
之后还要添加监听器,这里选择是图形结果
![](https://image.cha138.com/20220602/970e3e7e67654e0c82bc2c2879bc570d.jpg)
再添加一个查看结果树吧
![](https://image.cha138.com/20220602/a234e51904b743719427cf9afe99f3b8.jpg)
在运行之前打开log Viewer
![](https://image.cha138.com/20220602/ff1703e32b4b4d0789d1c7e962929b21.jpg)
下面开始运行:
![](https://image.cha138.com/20220602/2469998810f84650beeba2d9387b41cb.jpg)
执行成功,来感受一下结果:
![](https://image.cha138.com/20220602/6b23639838a14f40931b1d7769bee30a.jpg)
点进去
![](https://image.cha138.com/20220602/b8b0dcfc49744e8e9b6d5dc83cd7b3f9.jpg)
查看结果树
![](https://image.cha138.com/20220602/0d0f526e97b04310b14cbf9ac6c74cde.jpg)
四、代码模拟
这里需要用到一个类,就是 CountDownLatch。CountDownLatch 是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。
更多多线程教程可以参考:https://www.javastack.cn/categories/Java/
CountDownLatch 用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用 countDown 方法使当前计数器的值变为零,每次调用 countDown 计数器的值减1。最新面试题整理好了,大家可以在Java面试库小程序在线刷题。
当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。下图和它的方法可以体现出来:
![](https://image.cha138.com/20220602/f115bb11cb03419bb55750e32280916c.jpg)
public CountDownLatch(int count) ;
然后下面这 3 个方法是 CountDownLatch 类中最重要的方法(上图能够反映出来)
public void await() throws InterruptedException ;
public boolean await(long timeout, TimeUnit unit) throws InterruptedException ;
public void countDown() ;
Semaphore 与 CountDownLatch 相似,不同的地方在于 Semaphore 的值被获取到后是可以释放的,并不像 CountDownLatch 那样一直减到底。
用于获取权限的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 不是线程安全的,且没有作防护措施,结果是错的
上面是对代码的并发模拟的简单形式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用途很广泛,等之后更新Java网络编程的东西的时候,还会详细介绍它们。
版权声明:本文为CSDN博主「沉晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42322103/article/details/102736170
关注Java技术栈看更多干货
获取 Spring Boot 实战笔记!
![](https://image.cha138.com/20220602/6007cfd091b84c63b77a6ffaacc2ebd7.jpg)
![](https://image.cha138.com/20220602/5ce8c8a1eb4248c3bef9f9b647012e1e.jpg)
以上是关于别再写代码测试并发了,太 Low!模拟并发的 4 种方法,还有谁不会??的主要内容,如果未能解决你的问题,请参考以下文章
别再写 main 方法测试了,太 Low,这才是专业 Java 测试方法。。
别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!
别再写 main 方法测试了,太 Low,这才是专业 Java 测试方法
别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!