关于java:模拟并发的-4-种方式还有谁不会

34次阅读

共计 3679 个字符,预计需要花费 10 分钟才能阅读完成。

一、Postman

Postman 是一个款 HTTP 申请模仿工具

首先演示一下 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~";}
}

为了便于操作,个别会将

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/downl…

因为我的操作系统是 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 是一个计数器闭锁,通过它能够实现相似于阻塞以后线程的性能,即:一个线程或多个线程始终期待,直到其余线程执行的操作实现。

更多多线程教程能够参考:https://www.javastack.cn/cate…

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

当计数器值减至零时,所有因调用 await() 办法而处于期待状态的线程就会持续往下执行。这种景象只会呈现一次,因为计数器不能被重置。下图和它的办法能够体现进去:

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 不是线程平安的,且没有作防护措施,后果是错的

下面是对代码的并发模拟的简略模式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用处很宽泛,等之后更新 Java 网络编程的货色的时候,还会具体介绍它们。

版权申明:本文为 CSDN 博主「沉晓」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。
原文链接:https://blog.csdn.net/qq_4232…

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0