[4つの方法のJavaの並行処理の同時シミュレーション]

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_42322103/article/details/102736170

4つの方法の同時シミュレーション

、ポストマン

ポストマンは、シミュレーションツールのhttpリクエストをするものとされた
ここに画像を挿入説明
最初のあなたの最も基本的な使用の郵便配達を示し
、次のように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アドレス+ポート番号が頻繁に使用され、それが環境に提供することができます

右上の設定アイコンをクリックして
ここに画像を挿入説明
グローバル選択するために、
ここに画像を挿入説明
入力された情報を
ここに画像を挿入説明
さらにテストした後は、そのような短いに従事することができるようになります
ここに画像を挿入説明
後の基本的な使用を知って、私たちは、同時テストをシミュレートする方法を見て

ここに画像を挿入説明
ここに画像を挿入説明
基本的な情報を入力し、作成し
ここに画像を挿入説明
、この時点で同時実行フォルダが作成され、私達はちょうどこのフォルダに例のデモをテストすることができます

ここに画像を挿入説明
ここに画像を挿入説明
あなたが同時実行で見ることができます。この時間は、このインターフェイスのテスト
ここに画像を挿入説明
選択の同時テストを:
ここに画像を挿入説明
私たちは、ポップアップボックスをしたい、この時間は、
ここに画像を挿入説明
ファイル名を指定して実行同時実行をクリックしてください

あなたはすぐにあなたが記録したログを印刷し、あなたがログに表示さよりも速度、印刷速度のテストは、実際には、に単語を一つずつ表示したいので、緑は正常を示し、「燃える」でCPUを感じることができます

ここに画像を挿入説明

二、Apacheのベンチ(AB)

ApacheBenchは、Apacheサーバは、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

たCountDownLatch同様の差セマフォがたCountDownLatch保存されているとして価値がない終わりのように、解放されたセマフォを取得していることです。

また、弁の流量より同様の機能を制限するために使用されます。N個のスレッドまでの一定の限られたリソースにアクセスすることができた場合は、その後、Nプライマリスレッドよりは、既存のスレッドの終わりには、解放し、新しいスレッドになるまで放置されると同時に、アクセス権を持つことを許されていません。ロックおよびロック処理をアンロックするために幾分類似しています。相対的に言って、彼もまた、2つの主要な方法があります。

取得するための許可()、同様の基礎となる実装のCountDownLatch.countdown()を取得することは、
権限のリリースを()放出するため、基礎となる実装の取得は、()の逆数のプロセスです。

二つのクラスで同時にシミュレートすることができます。

テスト:

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++;
    }
}

カウントが保護対策のための安全ではなく、スレッドされていないので、結果が間違っています
ここに画像を挿入説明

上記の同時シミュレーションコードのシンプルな形で、それは二つのクラスが、このようなJavaのネットワークプログラミングの何かを更新した後のように、彼らはとても広く、ここで言及されている同時シミュレーションを行うように設計されていないことは注目に値する、詳細に説明しますそれら。

おすすめ

転載: blog.csdn.net/qq_42322103/article/details/102736170