文章目录

  • 并发模拟的四种方式
    • 一、Postman
    • 二、Apache Bench(AB)
    • 三、并发模拟工具JMeter
    • 四、代码模拟

并发模拟的四种方式

一、Postman

Postman是一个款http请求模拟工具

首先演示一下postman最基本的使用
创建一个Springboot项目,测试的代码如下:

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~";}
}


为了便于操作,一般会将

http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境

点击右上角的设置图标

选择global

输入信息

以后再进行测试就能这样搞简写了

知道基本使用之后,我们来看一下如何模拟并发测试



填写基本信息后,创建

这个时候会创建出Concurrency的文件夹,我们可以把刚才测试的demo的例子放进这个文件夹下



这个时候就可以在Concurrency下看到这个接口测试了

选择并发测试:

这个时候弹出我们想要的框了

点击Run Concurrency

你可以立马感觉到CPU在“燃烧”,因为要记录并打印日志,显示的话是一条一条来的,其实测试的速度,要比你看到的打印的日志的速度快,绿色表示正常

二、Apache Bench(AB)

ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。

ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。

使用的话,首先需要安装Apache服务器

网站:传送门 http://httpd.apache.org/download.cgi

因为我的操作系统是windows10, 这里选择File for Microsoft Windows

Linux下的安装是非常简单的,这里不再演示


选择 ApacheHaus

进入下载页面 选择适合自己电脑的版本

文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数,注意文件路径最好都是英文

关于需要设置参数,conf->httpd.conf 使用文本编辑器打开,

需要修改的有三个地方:


运行根目录,修改成自己解压到本地的路径

监听端口,默认监听端口是80,如果已被使用会报错需要修改,如果80端口未被使用,可不修改;如果修改了监听端口,则需要把ServerName localhost也相应改成同样的端 口号


DocumentRoot 测试文件存放地,且该目录必须存在

配置完成后,命令行cmd进入D:\softUtil\Apache24\bin目录下

httpd.exe  -k  install


启动:

httpd.exe -k start

测试:

-n :请求数
-c: 并发数

三、并发模拟工具JMeter

JMeter也是一款性能测试工具,是图形化的。

下载地址:传送门 http://jmeter.apache.org/


需要Java8+的环境

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

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



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

填写HTTP请求相关的内容

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

再添加一个查看结果树吧

在运行之前打开log Viewer

下面开始运行:

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

点进去

查看结果树

四、代码模拟

这里需要用到一个类,就是CountDownLatch。

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

CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用countDown方法使当前计数器的值变为零,每次调用countDown计数器的值减1。当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。

下图和它的方法可以体现出来:

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

public CountDownLatch(int count) {  };  //参数count为计数值

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

public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { };  //将count值减1

下面还需要看一个类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不是线程安全的,且没有作防护措施,结果是错的

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

【Java并发编程】并发模拟的四种方式相关推荐

  1. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  2. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...

  3. java中Map遍历的四种方式

    java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...

  4. Java 数组转List的四种方式

    Java 数组转List的四种方式 第一种方式(未必最佳):使用ArrayList.asList(strArray) ​ 使用Arrays工具类Arrays.asList(strArray)方式,转换 ...

  5. Java反射之创建对象的四种方式

    Java反射之创建对象的四种方式 1.使用new关键字 2.使用Java反射机制,反射构造器 3.使用克隆方式创建对象Cloneable 4.使用序列化Serializable 1.使用Java反射机 ...

  6. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. 1 2 3 4 Map<Integer, Intege ...

  7. android java 多线程,Android多线程的四种方式

    当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread.通常一个应用的所有组件都运行在 ...

  8. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

  9. java中创建线程的四种方式及线程池详解

    众所周知,我们在创建线程时有四种方法可以用,分别是: 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 4.使用线程池创建(使用ja ...

最新文章

  1. [c#基础]关于try...catch最常见的笔试题
  2. PHP入门指导:如何学习PHP?
  3. [转]高颜值、好用、易扩展的微信小程序 UI 库,Powered by 有赞
  4. memcache、Redis与MongoDB的学习-1
  5. md /mdd /ml /mt/mtd
  6. SQL的经典语句(太全了)
  7. 5-14卷积神经网添加正则化
  8. linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID
  9. Git学习总结(11)——Git撤销操作详解
  10. ACM字符串处理算法经典:字符串搜索
  11. 【转】重装系统后找不到硬盘
  12. Linux驱动模型解析bus之platform bus
  13. python seo百度_Python与seo,百度关键词相关搜索关键词采集源码
  14. Flutter学习 — 使用不同类型的子项创建列表
  15. Day-22 基础模块3 正则表达式_re模块
  16. 西门子1200的实例
  17. 腾讯CJ放出大招!次世代手游大作曝光,画面堪比3A大作
  18. 今日头条信息流 - 广告策略
  19. transformer之预训练task小析(五)
  20. 关于我写公众号的目的和原因

热门文章

  1. 户外探险9种必备装备选购指南
  2. wordpress程序搬家
  3. 2022年适合圣诞送礼的时尚蓝牙耳机品牌推荐
  4. 笔记本重置找不到恢复环境_重置Win10电脑时提示找不到恢复环境的解决教程
  5. Cadence每日一学_06 | OrCAD中自有默认元器件(原理图)库详细介绍
  6. 【快速开发App实战】BUI高仿网易新闻App系列一、搭建App开发环境和工作空间
  7. 搭建Lua开发环境(Lua解释器+IDEA编译器)
  8. 使用wxpy统计微信好友数量及男女数量,并保存好友数据到本地
  9. 金丹期前期:1.3、python语言-python的程序的控制结构:选择与循环
  10. 归并排序c语言实验报告,归并排序算法及其C语言具体实现