当前位置: 首页 > 后端技术 > Java

4种模拟并发的方法,还有谁不会??

时间:2023-04-01 19:18:24 Java

1.PostmanPostman是一款HTTP请求模拟工具首先演示Postman最基本的使用,创建一个SpringBoot工程,测试代码如下:importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;导入org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("test")公共类TestConrtoller{@GetMapping("demo")publicStringtestDemo(){返回“结果~”;}}为了操作方便,一般http://127.0.0.1:8080是经常使用的地址+端口号,可以设置为环境。点击右上角的设置图标,选择global,输入测试前的信息,了解了基本的用法之后,我们来看看如何模拟并发测试。填写好基本信息后,创建:这时候会创建一个Concurrency文件夹,我们可以把刚才测试的demo例子放到这个文件夹中。底部:这时候可以在Concurrency下看到这个接口,测试一下。选择ConcurrencyTest:这时候会弹出我们想要的框。点击RunConcurrency,马上就能感觉到CPU在“烧”,因为需要记录和打印日志,显示的字眼一个一个来。事实上,测试的速度比你看到的打印日志的速度还要快。绿色表示正常。2、ApacheBench(AB)ApacheBench是Apache服务器自带的Web压力测试工具,简称ab。ab是另一个命令行工具,对发起加载的机器要求很低。根据ab命令,可以创建多个并发访问线程来模拟多个访问者同时访问某个URL地址,因此可以用来测试目标服务器的负载压力。总体来说,ab工具小巧简单,上手很快。可以提供所需的基本性能指标,但没有图形化结果,无法监控。使用它首先需要安装Apache服务器网站:传送门http://httpd.apache.org/downl...因为我的操作系统是windows10,这里选择FileforMicrosoftWindowsLinux很简单,这里不用然后演示选择ApacheHaus进入下载页面,选择适合自己电脑的版本文件,解压到本地文件夹。如果不是解压在c盘,需要设置参数。注意文件路径最好是英文的。关于需要设置参数,conf->httpd用文本编辑器打开.conf,需要修改三个地方:运行根目录,修改为你解压到本地监听端口的路径,默认监听端口为80,如果已经使用,会报错,需要修改,如果80端口没有使用,不需要修改;如果修改监听端口,需要将ServerNamelocalhost改为相同端口号DocumentRoot测试文件存放位置,目录必须存在配置完成后,命令行cmd输入D:\softUtil\Apache24\启动httpd.exe-k安装在bin目录下:httpd.exe-k开始测试:-n:请求数-c:并发数3.并发模拟工具JMeterJMeter也是一个性能测试工具,是图形化的。下载地址:传送门http://jmeter.apache.org/需要Java8+环境解压到你认为合适的目录(注意英文路径最好),进入其bin目录,启动jmeter.bat。使用起来非常简单。首先在测试计划部分新建一个线程组并设置好基本信息,然后添加HTTP请求(如果设置了基本信息也不行,直接添加HTTP请求即可)。填写HTTP请求相关内容后,需要添加监听器。在这里,选择Itisagraphicalresult然后添加视图结果树。运行前打开日志查看器,开始运行:执行成功,感受一下结果:点进去查看结果树4.代码模拟这里需要一个类,就是CountDownLatch。CountDownLatch是一个计数器锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程等待,直到其他线程执行的操作完成。更多多线程教程请参考:https://www.javastack.cn/cate...CountDownLatchisinitializedwithagivencounter。这个计数器的操作是一个原子操作,即只有一个线程可以操作这个计数器。调用该类的await方法的线程会一直阻塞,直到其他线程调用countDown方法使当前计数器的值为0,每次调用countDown时计数器的值减1。当计数器值减为零时,所有通过调用await()方法处于等待状态的线程将继续执行。这种现象只会出现一次,因为计数器无法重置。下图及其方法可以体现出来:CountDownLatch类只提供了一个构造函数:publicCountDownLatch(intcount){};而下面三个方法是CountDownLatch类中最重要的方法(上图可以体现)publicvoidawait()throwsInterruptedException{};publicbooleanawait(longtimeout,TimeUnitunit)throwsInterruptedException{};publicvoidcountDown(){};接下来,我们要看一个类似于CountDownLatch的类SemaphoreSemaphore,不同的是Semaphore的值是获取到后可以释放,而不是像CountDownLatch一样一直递减到最后。它也更多地用于限制流量,类似于阀门的功能。如果某些资源被限制为最多可以访问N个线程,则不允许更多的线程访问超过N个master。同时,当现有的线程结束时,会释放它们,允许新的线程进来,有点类似于锁的加锁和解锁过程。相对来说,他也有两个主要的方法:acquire()获取权限,其底层实现类似于CountDownLatch.countdown();release()用于释放权限,其底层实现是与acquire()逆过程的交互。通过这两个类可以进行并开发的模拟:测试一下:importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.*;@Slf4jpublicclassCuncurrencyTest{publicstaticintclientTotal=5000;公共静态intthreadTotal=200;公共静态整数计数=0;publicstaticvoidmain(String[]args)throwsInterruptedException{ExecutorServiceexecutorService=Executors.newCachedThreadPool();finalSemaphore信号量=newSemaphore(threadTotal);finalCountDownLatchcountDownLatch=newCountDownLatch(clientTotal);for(inti=0;i{try{semaphore.acquire();add();semaphore.release();}catch(InterruptedExceptione){e.printStackTrace();log.error("异常",e);}countDownLatch.countDown();});}countDownLatch.await();executorService.shutdown();log.info("计数:{}",计数);}privatestaticvoidadd(){count++;}}因为count不是线程安全的,并且没有保护措施,结果是错误的。以上是代码并发模拟的一种简单形式。值得注意的是,这里提到的两个类并不是专门用于并发模拟的。它们有广泛的用途。后面更新Java网络编程的东西,也会详细介绍他们的版权声明:本文为CSDN博主“沉晓”的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处转载链接及本声明。