并發(fā)模擬工具詳解
簡(jiǎn)介:
- 一、Psotman
- 二、Apache Bench(AB)
- 三、JMeter
- 四、代碼
一、Psotman:Http請(qǐng)求模擬工具
嚴(yán)格來(lái)說(shuō)postMan并不是并發(fā)請(qǐng)求,而是串行執(zhí)行的,現(xiàn)在用postMan更多的是用來(lái)測(cè)試Http連接的一個(gè)工具,但是也是一個(gè)很實(shí)用的工具,也有一些比較強(qiáng)大的功能和優(yōu)點(diǎn)
1.1 下載地址
- 1) Postman for MAC:https://app.getpostman.com/app/download/osx64?utm_source=site&utm_medium=apps&utm_campaign=macapp&_ga=2.21151352.2119858274.1527039878-1088353859.1527039878
- 2) Postman for windows X64:https://app.getpostman.com/app/download/win64?_ga=2.201562513.1250696341.1530543681-1582181135.1530543681
- 3) Postman for windows X86:https://app.getpostman.com/app/download/win32?_ga=2.21151352.2119858274.1527039878-1088353859.1527039878
- 4) Postman for linux X64:https://app.getpostman.com/app/download/linux64?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878
- 5) Postman for Linux X86:https://app.getpostman.com/app/download/linux32?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878
- 6) 官網(wǎng)地址:https://www.getpostman.com/
1.2 操作說(shuō)明(以win64為例)
1、打開(kāi)Postman,輸入我們需要測(cè)試的網(wǎng)址,點(diǎn)擊左邊的"+",保存請(qǐng)求

2、點(diǎn)擊"+"后,彈出下面提示,保存鏈接地址生成測(cè)試文件夾名稱

3、保存成功后,選擇"collections"后選擇文件夾名為"gbfTest"的,點(diǎn)擊小三角——點(diǎn)擊Run

4、這里我們可以設(shè)置請(qǐng)求次數(shù)和間隔時(shí)間,一般間隔時(shí)間會(huì)設(shè)置為0,設(shè)置好之后,我們點(diǎn)擊Run gbfTest運(yùn)行
5、查看結(jié)果,從圖中我們可以看到百度的響應(yīng)速度還是很快的

6、點(diǎn)擊 Run Summary 可以看到運(yùn)行結(jié)果概述

7、測(cè)試全部通過(guò)

8、測(cè)試結(jié)果可以通過(guò)點(diǎn)擊Export Results按鈕進(jìn)行導(dǎo)出,方便分析每次的請(qǐng)求時(shí)間

二、Apace Bench(AB):Apache附帶的工具,測(cè)試網(wǎng)站性能
2.1 簡(jiǎn)介
Apache Bench 是 Apache 服務(wù)器自帶的一個(gè)web壓力測(cè)試工具,簡(jiǎn)稱ab。ab又是一個(gè)命令行工具,對(duì)發(fā)起負(fù)載的本機(jī)要求很低,根據(jù)ab命令可以創(chuàng)建很多的并發(fā)訪問(wèn)線程,模擬多個(gè)訪問(wèn)者同時(shí)對(duì)某一URL地址進(jìn)行訪問(wèn),因此可以用來(lái)測(cè)試目標(biāo)服務(wù)器的負(fù)載壓力??偟膩?lái)說(shuō)ab工具小巧簡(jiǎn)單,它不僅可以對(duì)apache服務(wù)器進(jìn)行網(wǎng)站訪問(wèn)壓力測(cè)試,也可以對(duì)或其它類型的服務(wù)器進(jìn)行壓力測(cè)試。比如nginx、tomcat、IIS等,上手學(xué)習(xí)較快,可以提供需要的基本性能指標(biāo),但是沒(méi)有圖形化結(jié)果,不能監(jiān)控
2.2 原理
ab命令會(huì)創(chuàng)建多個(gè)并發(fā)訪問(wèn)線程,模擬多個(gè)訪問(wèn)者同時(shí)對(duì)某一URL地址進(jìn)行訪問(wèn)。它的測(cè)試目標(biāo)是基于URL的,因此,它既可以用來(lái)測(cè)試apache的負(fù)載壓力,也可以測(cè)試nginx、lighthttp、tomcat、IIS等其它Web服務(wù)器的壓力
2.3 Apache Bench安裝
Apache服務(wù)器,下載地址:https://www.apachelounge.com/download/
選擇:httpd-2.4.41-win64-VS16 下載目錄結(jié)構(gòu):

2.4 Apache Bench 使用
運(yùn)行環(huán)境:Windows7 Apache Bench版本:httpd-2.4.41-win64-VS16
1、進(jìn)入cmd目錄下,進(jìn)入我們解壓好的Apache Bench目錄下

3 使用命令
- ab -c 10 -n 10 http://www.baidu.com/ 或者 ab.exe -n 1000 -c 500 http://www.baidu.com
ab -c 10 -n 10 http://www.baidu.com/ 或者 ab.exe -n 1000 -c 500 http://www.baidu.com
對(duì)百度首頁(yè)進(jìn)行一個(gè)請(qǐng)求總數(shù)為1000,本次請(qǐng)求并發(fā)數(shù)為500的測(cè)試

參數(shù)分析:
- C:\Users\Lenovo\Downloads\httpd-2.4.41-win64-VS16\Apache24\bin>ab.exe -n 1000 -c
- 500 http://www.baidu.com/path
- This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
- Benchmarking www.baidu.com (be patient)
- Completed 100 requests
- Completed 200 requests
- Completed 300 requests
- Completed 400 requests
- Completed 500 requests
- Completed 600 requests
- Completed 700 requests
- Completed 800 requests
- Completed 900 requests
- Completed 1000 requests
- Finished 1000 requests
- Server Software: Apache #測(cè)試服務(wù)器的名字
- Server Hostname: www.baidu.com #請(qǐng)求的URL主機(jī)名
- Server Port: 80 #請(qǐng)求端口
- Document Path: /path #請(qǐng)求路徑
- Document Length: 222 bytes #頁(yè)面大小
- Concurrency Level: 500 #并發(fā)量,設(shè)置的參數(shù)之一
- Time taken for tests: 45.805 seconds #整個(gè)測(cè)試所用的時(shí)間/秒
- Complete requests: 1000 #完成的請(qǐng)求數(shù)
- Failed requests: 0 #失敗的請(qǐng)求數(shù)
- Non-2xx responses: 1000 #接收到的HTTP響應(yīng)數(shù)據(jù)的頭信息中含有2XX以外的狀態(tài)碼,則會(huì)在測(cè)試結(jié)果中顯示另一個(gè)名為“Non-2xx responses”的統(tǒng)計(jì)項(xiàng),用于統(tǒng)計(jì)這部分請(qǐng)求數(shù)(1000)
- Total transferred: 484000 bytes #表示所有請(qǐng)求的響應(yīng)數(shù)據(jù)長(zhǎng)度總和
- HTML transferred: 222000 bytes #表示所有請(qǐng)求的響應(yīng)數(shù)據(jù)中正文數(shù)據(jù)的總和
- Requests per second: 21.83 [#/sec] (mean) #吞吐率,吞吐率是與并發(fā)數(shù)相關(guān)的,使請(qǐng)求總數(shù)相同,但如果并發(fā)數(shù)不一樣,吞吐率還是很可能有很大差異的
- Time per request: 22902.310 [ms] (mean) #用戶平均請(qǐng)求等待時(shí)間。也就是一次并發(fā)總的時(shí)間
- Time per request: 45.805 [ms] (mean, across all concurrent requests) #服務(wù)器平均請(qǐng)求等待時(shí)間。也就是一次請(qǐng)求(在本例中也就是500中的平均每一次)所需時(shí)間
- Transfer rate: 10.32 [Kbytes/sec] received #這些請(qǐng)求在單位時(shí)間內(nèi)從服務(wù)器獲取的數(shù)據(jù)長(zhǎng)度
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 9 46 460.5 11 9060
- Processing: 25 20066 13796.4 14798 36549
- Waiting: 14 16163 15029.9 8460 36484
- Total: 37 20111 13785.1 22804 36562
- Percentage of the requests served within a certain time (ms)
- 50% 22804 #50%用戶請(qǐng)求在22804ms內(nèi)返回
- 66% 33043 #66%用戶請(qǐng)求在33043ms內(nèi)返回
- 75% 34181
- 80% 34791
- 90% 35877
- 95% 36416
- 98% 36502 #98%用戶請(qǐng)求在36502ms內(nèi)返回
- 99% 36512
- 100% 36562 (longest request)
命令參數(shù)參考:
- -n requests Number of requests to perform //本次測(cè)試發(fā)起的總請(qǐng)求數(shù)
- -c concurrency Number of multiple requests to make //一次產(chǎn)生的請(qǐng)求數(shù)(或并發(fā)數(shù))
- -t timelimit Seconds to max. wait for responses //測(cè)試所進(jìn)行的最大秒數(shù),默認(rèn)沒(méi)有時(shí)間限制。
- -r Don't exit on socket receive errors. // 拋出異常繼續(xù)執(zhí)行測(cè)試任務(wù)
- -p postfile File containing data to POST //包含了需要POST的數(shù)據(jù)的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt
- -T content-type Content-type header for POSTing
- //POST數(shù)據(jù)所使用的Content-type頭信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p)
- -v verbosity How much troubleshooting info to print
- //設(shè)置顯示信息的詳細(xì)程度 – 4或更大值會(huì)顯示頭信息, 3或更大值可以顯示響應(yīng)代碼(404, 200等), 2或更大值可以顯示警告和其他信息。 -V 顯示版本號(hào)并退出。
- -C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable)
- //-C cookie-name=value 對(duì)請(qǐng)求附加一個(gè)Cookie:行。 其典型形式是name=value的一個(gè)參數(shù)對(duì)。此參數(shù)可以重復(fù),用逗號(hào)分割。
- 提示:可以借助session實(shí)現(xiàn)原理傳遞 JSESSIONID參數(shù), 實(shí)現(xiàn)保持會(huì)話的功能,如-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。
- -w Print out results in HTML tables //以HTML表的格式輸出結(jié)果。默認(rèn)時(shí),它是白色背景的兩列寬度的一張表。
2.5 使用注意
1、MAC中自帶了Apache。
2、在使用ab命令時(shí),并發(fā)了過(guò)高會(huì)出現(xiàn)錯(cuò)誤:Too many open files,由于系統(tǒng)打開(kāi)文件數(shù)量限制了具有輕量化特點(diǎn)的bench還是很適合中小企業(yè)使用,尤其在于模擬訪問(wèn)頁(yè)面的多機(jī)測(cè)試
三、JMeter:Apache組織開(kāi)發(fā)的壓力測(cè)試工具(使用比較多的工具)
3.1 簡(jiǎn)介
Apache JMeter是一款純java編寫(xiě)負(fù)載功能測(cè)試和性能測(cè)試開(kāi)源工具軟件。相比Loadrunner而言,JMeter小巧輕便且免費(fèi),逐漸成為了主流的性能測(cè)試工具,是每個(gè)測(cè)試人員都必須要掌握的工具之一
JDK版本:1.8 運(yùn)行環(huán)境:Windows 7 64 JMeter版本:3.3
注意:安裝JMeter需要 Java8和8以上的JDK版本
3.2 JDK安裝(如果已經(jīng)安裝JDK 1.8 忽略這一步)
1、jdk官網(wǎng)下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、選擇 Java SE 8u231,點(diǎn)擊JDK下載

安裝下載的JDK
配置系統(tǒng)環(huán)境變量 具體可以自行查找資料,這里就不做過(guò)多描述
3.2 JMeter安裝
1、官網(wǎng)下載地址:JMeter地址:http://jmeter.apache.org/download_jmeter.cgi
2、下載最新JMeter 5.1.1 版本:Apache JMeter 5.1.1 (Requires Java 8+)

3、下載完成后解壓zip包,雙擊bin目錄下jmeter.bat文件

3.3 JMeter 使用
1、雙擊bin目錄下jmeter.bat文件后,打開(kāi)Apache JMeter工具

2、案例測(cè)試(Test Plan - > Add - > Thread(User) - > Thread Group)

3、設(shè)置名稱和線程數(shù)

線程參數(shù)解讀:Number of Threads (users):虛擬用戶數(shù)(也就是線程數(shù)),一個(gè)虛擬用戶占用一個(gè)進(jìn)程或線程Ramp-Up Period(in seconds):準(zhǔn)備時(shí)長(zhǎng),設(shè)置的虛擬用戶數(shù)需要多長(zhǎng)時(shí)間全部啟動(dòng)。
Loop Count:循環(huán)次數(shù)每個(gè)線程發(fā)送請(qǐng)求的次數(shù)
如果線程數(shù)為20,循環(huán)次數(shù)為100,那么每個(gè)線程發(fā)送100次請(qǐng)求??傉?qǐng)求數(shù)為20*100=2000 。
如果勾選了“Forever”,那么所有線程會(huì)一直發(fā)送請(qǐng)求,一到選擇停止運(yùn)行腳本。
Delay Thread creation until needed:直到需要時(shí)延遲線程的創(chuàng)建
Scheduler:調(diào)度器,設(shè)置線程組啟動(dòng)的開(kāi)始時(shí)間和結(jié)束時(shí)間(配置調(diào)度器時(shí),需要勾選循環(huán)次數(shù)為永遠(yuǎn))
Duration(Seconds):持續(xù)時(shí)間(秒),測(cè)試持續(xù)時(shí)間,會(huì)覆蓋結(jié)束時(shí)間
Startup delay(Seconds):?jiǎn)?dòng)延遲(秒),測(cè)試延遲啟動(dòng)時(shí)間,會(huì)覆蓋啟動(dòng)時(shí)間
4、添加Http請(qǐng)求
右鍵點(diǎn)擊,Htto請(qǐng)求 > Add > Sampler > Http Request

接下來(lái)我們對(duì)接口 https://www.baidu.com/s?ie=UTF-8&wd=edg進(jìn)行性能測(cè)試,如下圖所示:

請(qǐng)求參數(shù)詳解:
- Web Server(Http服務(wù)): 1、Protocol[http]:協(xié)議,向目標(biāo)服務(wù)器發(fā)送HTTP請(qǐng)求協(xié)議,可以是HTTP或HTTPS,默認(rèn)為HTTP 2、服務(wù)器名稱或IP:HTTP請(qǐng)求發(fā)送的目標(biāo)服務(wù)器名稱(域名)或IP 3、Port Number:端口號(hào)
- Http Reuqeset(Http請(qǐng)求體): 1、Method:請(qǐng)求方法類型,有GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等 2、path:目標(biāo)URL路徑,除去服務(wù)器地址、端口和請(qǐng)求參數(shù)后所得到的數(shù)據(jù) 3、Content encoding:編碼方式,設(shè)置為 UTF-8
- 請(qǐng)求參數(shù): 設(shè)置請(qǐng)求參數(shù),都在下面的列表中進(jìn)行設(shè)置,
- 列表參數(shù)解讀:Name:請(qǐng)求參數(shù)名 Value:請(qǐng)求值 URL Encode:是否Url編碼 Conten-Type:內(nèi)容類型,有需要自行調(diào)整(一般選擇默認(rèn)即可) include Equals:是否包含等于
注意:參數(shù)傳入中文時(shí)需要勾選“URL Encode”
這里的按鈕都是針對(duì)列表中的數(shù)據(jù)進(jìn)行操作的
- Detail
- :查看參數(shù)詳情
- Add
- :添加一行列表請(qǐng)求參數(shù)
- Delte
- :刪除一行數(shù)據(jù)
- Up
- :設(shè)置列表參數(shù)上移
- Down
- :設(shè)置列表參數(shù)下移
- add from
- Clipdoard
- :從我們復(fù)制的內(nèi)容中進(jìn)行添加
5、添加察看結(jié)果樹(shù)
1、右鍵點(diǎn)擊 Http請(qǐng)求 > Add > Listener > View Results Tree

2、這里我們?cè)O(shè)置響應(yīng)數(shù)據(jù)格式:HTMLSourceFormatted,點(diǎn)擊運(yùn)行我們就可以看到請(qǐng)求結(jié)果

3、本次搜索返回結(jié)果頁(yè)面標(biāo)題為 edg_百度搜索

6、添加用戶自定義變量
1、添加用戶自定義變量用以Http請(qǐng)求參數(shù)化:Http請(qǐng)求 > Add > Config Element > User Defined Variables

2、新增請(qǐng)求參數(shù),存放搜索關(guān)鍵字

3、在 Http測(cè)試請(qǐng)求 中使用該參數(shù),格式為:${wd} ,如下圖所示

7、添加響應(yīng)斷言
右鍵點(diǎn)擊 Http測(cè)試請(qǐng)求(注意是Http測(cè)試請(qǐng)求) > Add > Assertions > Response Assertion
校驗(yàn)返回的文本中是否包含搜索詞,添加參數(shù)${wd}到要測(cè)試的模式中
- Contains
- :包括
- Matches
- :匹配
- Equals
- :相等
- SubString
- :原諒博主才疏學(xué)淺,這個(gè)就不做解釋了
- Not
- :否
- or
- :或者
7、添加響應(yīng)斷言結(jié)果
右鍵點(diǎn)擊 Http測(cè)試請(qǐng)求 > Add > Listener > Assertion Results

點(diǎn)擊運(yùn)行,查詢運(yùn)行結(jié)果

8、添加聚合報(bào)告
右鍵點(diǎn)擊 Http請(qǐng)求 > Add > Listener > Aggregate Report

到這里我們就完成了一個(gè)完整的Http接口的性能測(cè)試編寫(xiě),接下來(lái)我們會(huì)對(duì)它的性能進(jìn)行測(cè)試
3.4 JMeter 性能測(cè)試
1、配置Http請(qǐng)求(線程組)信息
點(diǎn)擊Http請(qǐng)求(線程組),配置相關(guān)的性能測(cè)試相關(guān)參數(shù)線程數(shù):50 循環(huán)次數(shù):永遠(yuǎn)持續(xù)時(shí)間:60秒

2、執(zhí)行測(cè)試信息
選擇聚合報(bào)告,查詢結(jié)構(gòu),點(diǎn)擊 箭頭 按鈕啟動(dòng)測(cè)試,如果要清楚具體內(nèi)容,點(diǎn)擊小掃把,清除調(diào)試結(jié)果

3、測(cè)試結(jié)果分析解讀
1、打開(kāi)聚合報(bào)告

參數(shù)詳解:
- Label:每個(gè) JMeter 的 element都有一個(gè) Name 屬性,這里顯示的是 Name 屬性的值
- #Samples:請(qǐng)求數(shù)——表示這次測(cè)試中一共發(fā)出了多少個(gè)請(qǐng)求 如果模擬10個(gè)用戶,每個(gè)用戶迭代10次,那么這里顯示100
- Average:平均響應(yīng)時(shí)間——默認(rèn)情況下是單個(gè) Request 的平均響應(yīng)時(shí)間 當(dāng)使用了 Transaction Controller 時(shí),以Transaction 為單位顯示平均響應(yīng)時(shí)間
- Median:中位數(shù),也就是 50% 用戶的響應(yīng)時(shí)間
- 90% Line:90% 用戶的響應(yīng)時(shí)間
- 99% Line:99% 用戶的響應(yīng)時(shí)間
- Min:最小響應(yīng)時(shí)間
- Max:最大響應(yīng)時(shí)間
- Error%:錯(cuò)誤率——錯(cuò)誤請(qǐng)求數(shù)/請(qǐng)求總數(shù)
- Throughput:吞吐量——默認(rèn)情況下表示每秒完成的請(qǐng)求數(shù)(Request per Second) 當(dāng)使用了TransactionController時(shí),也可以表示類似LoadRunner的TransactionperSecond數(shù)
- KB/Sec:每秒從服務(wù)器端接收到的數(shù)據(jù)量
在實(shí)際中我們需要關(guān)注的點(diǎn)只有—— #Samples 請(qǐng)求數(shù),Average 平均響應(yīng)時(shí)間,Min 最小響應(yīng)時(shí)間,Max 最大響應(yīng)時(shí)間,Error% 錯(cuò)誤率和Throughput 吞吐量
四、代碼模擬
1、Semaphore
Semaphore是計(jì)數(shù)信號(hào)量。Semaphore管理一系列許可證。每個(gè)acquire方法阻塞,直到有一個(gè)許可證可以獲得然后拿走一個(gè)許可證;每個(gè)release方法增加一個(gè)許可證,這可能會(huì)釋放一個(gè)阻塞的acquire方法。然而,其實(shí)并沒(méi)有實(shí)際的許可證這個(gè)對(duì)象,Semaphore只是維持了一個(gè)可獲得許可證的數(shù)量。
1.1 代碼演示:獲取一個(gè)許可證
- import lombok.extern.slf4j.Slf4j;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Semaphore;
- @Slf4j
- public class SemaphoreExample1 {
- private final static int threadCount = 20;
- public static void main(String[] args) throws Exception {
- ExecutorService exec = Executors.newCachedThreadPool();
- final Semaphore semaphore = new Semaphore(3);
- for (int i = 0; i < threadCount; i++) {
- final int threadNum = i;
- exec.execute(() -> {
- try {
- semaphore.acquire(); // 獲取一個(gè)許可
- test(threadNum);
- semaphore.release(); // 釋放一個(gè)許可
- } catch (Exception e) {
- log.error("exception", e);
- }
- });
- }
- exec.shutdown();
- }
- private static void test(int threadNum) throws Exception {
- log.info("{}", threadNum);
- Thread.sleep(1000);
- }
- }
執(zhí)行結(jié)果:如下圖所示,我們看到雖然結(jié)果是無(wú)序的,但是請(qǐng)求的線程數(shù)量是正確的,這里展示的是獲取一個(gè)許可,同時(shí)也釋放一個(gè)許可,我們可不可以獲取多個(gè)許可,釋放多個(gè)許可呢,答案是可以的

1.2 代碼演示:獲取多個(gè)許可證
- package com.mmall.concurrency.example.aqs;
- import lombok.extern.slf4j.Slf4j;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Semaphore;
- @Slf4j
- public class SemaphoreExample {
- private final static int threadCount = 20;
- public static void main(String[] args) throws Exception {
- ExecutorService exec = Executors.newCachedThreadPool();
- final Semaphore semaphore = new Semaphore(3);
- for (int i = 0; i < threadCount; i++) {
- final int threadNum = i;
- exec.execute(() -> {
- try {
- semaphore.acquire(3); // 獲取多個(gè)許可
- test(threadNum);
- semaphore.release(3); // 釋放多個(gè)許可
- } catch (Exception e) {
- log.error("exception", e);
- }
- });
- }
- exec.shutdown();
- }
- private static void test(int threadNum) throws Exception {
- log.info("{}", threadNum);
- Thread.sleep(1000);
- }
- }
執(zhí)行結(jié)果:這里我們看到我們?cè)O(shè)置了獲取多個(gè)許可同時(shí)也釋放多個(gè)許可,放回的線程數(shù)是正確的,同時(shí)執(zhí)行結(jié)果也是有序的

2、CountDownLatch
CountDownLatch是一個(gè)同步工具類,用來(lái)協(xié)調(diào)多個(gè)線程之間的同步,或者說(shuō)起到線程之間的通信(而不是用作互斥的作用)。CountDownLatch能夠使一個(gè)線程在等待另外一些線程完成各自工作之后,再繼續(xù)執(zhí)行。使用一個(gè)計(jì)數(shù)器進(jìn)行實(shí)現(xiàn)。計(jì)數(shù)器初始值為線程的數(shù)量。當(dāng)每一個(gè)線程完成自己任務(wù)后,計(jì)數(shù)器的值就會(huì)減一。當(dāng)計(jì)數(shù)器的值為0時(shí),表示所有的線程都已經(jīng)完成了任務(wù),然后在CountDownLatch上等待的線程就可以恢復(fù)執(zhí)行任務(wù)
2.1 代碼演示:
- import lombok.extern.slf4j.Slf4j;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- @Slf4j
- public class CountDownLatchExample1 {
- private final static int threadCount = 200;
- public static void main(String[] args) throws Exception {
- int num = 0;
- ExecutorService exec = Executors.newCachedThreadPool();
- final CountDownLatch countDownLatch = new CountDownLatch(threadCount);
- for (int i = 0; i < threadCount; i++) {
- final int threadNum = i;
- num++;
- exec.execute(() -> {
- try {
- test(threadNum);
- } catch (Exception e) {
- log.error("exception", e);
- } finally {
- countDownLatch.countDown();
- }
- });
- }
- countDownLatch.await();
- log.info("finish——"+num);
- exec.shutdown();
- }
- private static void test(int threadNum) throws Exception {
- Thread.sleep(100);
- log.info("{}", threadNum);
- Thread.sleep(100);
- }
- }
通過(guò)返回結(jié)果我們可以看到,設(shè)置的線程數(shù)量返回結(jié)果數(shù)量和我們?cè)O(shè)置的線程數(shù)量200一致
五、總結(jié)
postMan:非專業(yè)的并發(fā)測(cè)試,嚴(yán)格來(lái)說(shuō)postMan并不是并發(fā)請(qǐng)求,而是串行執(zhí)行的,postMan更多的是用來(lái)測(cè)試Http連接的一個(gè)工具,是一個(gè)很實(shí)用的工具
Apache Bench:Apache Bench是 Apache 服務(wù)器自帶的一個(gè)web壓力測(cè)試工具,簡(jiǎn)稱ab,ab工具小巧簡(jiǎn)單,上手學(xué)習(xí)較快,可以提供需要的基本性能指標(biāo),但是沒(méi)有圖形化結(jié)果,不能監(jiān)控
JMeter:Apache JMeter 是Apache 組織開(kāi)發(fā)的基于java的壓力測(cè)試工具。用于對(duì)軟件做壓力測(cè)試的工具,它可以用于測(cè)試靜態(tài)和動(dòng)態(tài)資源例如靜態(tài)文件、Java 小服務(wù)程序、CGI 腳本、Java 對(duì)象、 數(shù)據(jù)庫(kù), FTP 服務(wù)器等等
總的來(lái)說(shuō),并發(fā)測(cè)試中,JMeter和Apache Bench是比較好的選擇,由于Apache Bench是基于命令行的,ab處理速度更快,而Jmeter更準(zhǔn)確,由于Jmeter本身支持?jǐn)嘌浴⒖勺儏?shù)和CSV數(shù)據(jù)集的輸入,能設(shè)定更加靈活多變的的測(cè)試場(chǎng)景,至于postMan這款工具,用來(lái)最多的是用來(lái)模擬Http請(qǐng)求的一個(gè),并不是一個(gè)專業(yè)的并發(fā)請(qǐng)求工具。