自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

并發(fā)模擬工具詳解

開(kāi)發(fā) 開(kāi)發(fā)工具
嚴(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)

[[380130]]

 簡(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. 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. 2) Postman for windows X64:https://app.getpostman.com/app/download/win64?_ga=2.201562513.1250696341.1530543681-1582181135.1530543681 
  3. 3) Postman for windows X86:https://app.getpostman.com/app/download/win32?_ga=2.21151352.2119858274.1527039878-1088353859.1527039878 
  4. 4) Postman for linux X64:https://app.getpostman.com/app/download/linux64?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878 
  5. 5) Postman for Linux X86:https://app.getpostman.com/app/download/linux32?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878 
  6. 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 使用命令

  1. 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ù)分析:

  1. C:\Users\Lenovo\Downloads\httpd-2.4.41-win64-VS16\Apache24\bin>ab.exe -n 1000 -c 
  2.  500 http://www.baidu.com/path 
  3. This is ApacheBench, Version 2.3 <$Revision: 1843412 $> 
  4. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
  5. Licensed to The Apache Software Foundation, http://www.apache.org/ 
  6.  
  7. Benchmarking www.baidu.com (be patient) 
  8. Completed 100 requests 
  9. Completed 200 requests 
  10. Completed 300 requests 
  11. Completed 400 requests 
  12. Completed 500 requests 
  13. Completed 600 requests 
  14. Completed 700 requests 
  15. Completed 800 requests 
  16. Completed 900 requests 
  17. Completed 1000 requests 
  18. Finished 1000 requests 
  19.  
  20.  
  21. Server Software:        Apache      #測(cè)試服務(wù)器的名字 
  22. Server Hostname:        www.baidu.com  #請(qǐng)求的URL主機(jī)名 
  23. Server Port:            80        #請(qǐng)求端口 
  24.  
  25. Document Path:          /path      #請(qǐng)求路徑   
  26. Document Length:        222 bytes    #頁(yè)面大小 
  27.  
  28. Concurrency Level:      500        #并發(fā)量,設(shè)置的參數(shù)之一 
  29. Time taken for tests:   45.805 seconds  #整個(gè)測(cè)試所用的時(shí)間/秒 
  30. Complete requests:      1000      #完成的請(qǐng)求數(shù) 
  31. Failed requests:        0        #失敗的請(qǐng)求數(shù) 
  32. 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) 
  33. Total transferred:      484000 bytes  #表示所有請(qǐng)求的響應(yīng)數(shù)據(jù)長(zhǎng)度總和 
  34. HTML transferred:       222000 bytes  #表示所有請(qǐng)求的響應(yīng)數(shù)據(jù)中正文數(shù)據(jù)的總和 
  35. Requests per second:    21.83 [#/sec] (mean)    #吞吐率,吞吐率是與并發(fā)數(shù)相關(guān)的,使請(qǐng)求總數(shù)相同,但如果并發(fā)數(shù)不一樣,吞吐率還是很可能有很大差異的 
  36. Time per request:       22902.310 [ms] (mean)    #用戶平均請(qǐng)求等待時(shí)間。也就是一次并發(fā)總的時(shí)間 
  37. Time per request:       45.805 [ms] (mean, across all concurrent requests)    #服務(wù)器平均請(qǐng)求等待時(shí)間。也就是一次請(qǐng)求(在本例中也就是500中的平均每一次)所需時(shí)間 
  38. Transfer rate:          10.32 [Kbytes/sec] received    #這些請(qǐng)求在單位時(shí)間內(nèi)從服務(wù)器獲取的數(shù)據(jù)長(zhǎng)度 
  39.  
  40. Connection Times (ms) 
  41.               min  mean[+/-sd] median   max 
  42. Connect:        9   46 460.5     11    9060 
  43. Processing:    25 20066 13796.4  14798   36549 
  44. Waiting:       14 16163 15029.9   8460   36484 
  45. Total:         37 20111 13785.1  22804   36562 
  46.  
  47. Percentage of the requests served within a certain time (ms) 
  48.   50%  22804     #50%用戶請(qǐng)求在22804ms內(nèi)返回 
  49.   66%  33043    #66%用戶請(qǐng)求在33043ms內(nèi)返回 
  50.   75%  34181 
  51.   80%  34791 
  52.   90%  35877 
  53.   95%  36416 
  54.   98%  36502    #98%用戶請(qǐng)求在36502ms內(nèi)返回 
  55.   99%  36512 
  56.  100%  36562 (longest request) 

命令參數(shù)參考:

  1. -n requests Number of requests to perform //本次測(cè)試發(fā)起的總請(qǐng)求數(shù) 
  2. -c concurrency Number of multiple requests to make   //一次產(chǎn)生的請(qǐng)求數(shù)(或并發(fā)數(shù)) 
  3. -t timelimit Seconds to max. wait for responses    //測(cè)試所進(jìn)行的最大秒數(shù),默認(rèn)沒(méi)有時(shí)間限制。 
  4. -r Don't exit on socket receive errors.    // 拋出異常繼續(xù)執(zhí)行測(cè)試任務(wù) 
  5. -p postfile File containing data to POST  //包含了需要POST的數(shù)據(jù)的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt 
  6. -T content-type Content-type header for POSTing 
  7. //POST數(shù)據(jù)所使用的Content-type頭信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p) 
  8. -v verbosity How much troubleshooting info to print 
  9. //設(shè)置顯示信息的詳細(xì)程度 – 4或更大值會(huì)顯示頭信息, 3或更大值可以顯示響應(yīng)代碼(404, 200等), 2或更大值可以顯示警告和其他信息。 -V 顯示版本號(hào)并退出。 
  10. -C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable
  11. //-C cookie-name=value 對(duì)請(qǐng)求附加一個(gè)Cookie:行。 其典型形式是name=value的一個(gè)參數(shù)對(duì)。此參數(shù)可以重復(fù),用逗號(hào)分割。 
  12. 提示:可以借助session實(shí)現(xiàn)原理傳遞 JSESSIONID參數(shù), 實(shí)現(xiàn)保持會(huì)話的功能,如-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。 
  13. -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)行操作的

  1. Detail 
  2. :查看參數(shù)詳情 
  3.  
  4. Add 
  5. :添加一行列表請(qǐng)求參數(shù) 
  6.  
  7. Delte 
  8. :刪除一行數(shù)據(jù) 
  9.  
  10. Up 
  11. :設(shè)置列表參數(shù)上移 
  12.  
  13. Down 
  14. :設(shè)置列表參數(shù)下移 
  15.  
  16. add from  
  17. Clipdoard 
  18. :從我們復(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è)試的模式中

  1. Contains 
  2. :包括 
  3.  
  4. Matches 
  5. :匹配 
  6.  
  7. Equals 
  8. :相等 
  9.  
  10. SubString 
  11. :原諒博主才疏學(xué)淺,這個(gè)就不做解釋了 
  12.  
  13. Not 
  14. :否 
  15.  
  16. or 
  17. :或者 

 

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ù)詳解:

  1. Label:每個(gè) JMeter 的 element都有一個(gè) Name 屬性,這里顯示的是 Name 屬性的值
  2. #Samples:請(qǐng)求數(shù)——表示這次測(cè)試中一共發(fā)出了多少個(gè)請(qǐng)求 如果模擬10個(gè)用戶,每個(gè)用戶迭代10次,那么這里顯示100
  3. Average:平均響應(yīng)時(shí)間——默認(rèn)情況下是單個(gè) Request 的平均響應(yīng)時(shí)間 當(dāng)使用了 Transaction Controller 時(shí),以Transaction 為單位顯示平均響應(yīng)時(shí)間
  4. Median:中位數(shù),也就是 50% 用戶的響應(yīng)時(shí)間
  5. 90% Line:90% 用戶的響應(yīng)時(shí)間
  6. 99% Line:99% 用戶的響應(yīng)時(shí)間
  7. Min:最小響應(yīng)時(shí)間
  8. Max:最大響應(yīng)時(shí)間
  9. Error%:錯(cuò)誤率——錯(cuò)誤請(qǐng)求數(shù)/請(qǐng)求總數(shù)
  10. Throughput:吞吐量——默認(rèn)情況下表示每秒完成的請(qǐng)求數(shù)(Request per Second) 當(dāng)使用了TransactionController時(shí),也可以表示類似LoadRunner的TransactionperSecond數(shù)
  11. 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ù)量。

[[380133]]

1.1 代碼演示:獲取一個(gè)許可證

  1. import lombok.extern.slf4j.Slf4j; 
  2.  
  3. import java.util.concurrent.CountDownLatch; 
  4. import java.util.concurrent.ExecutorService; 
  5. import java.util.concurrent.Executors; 
  6. import java.util.concurrent.Semaphore; 
  7.  
  8. @Slf4j 
  9. public class SemaphoreExample1 { 
  10.  
  11.     private final static int threadCount = 20; 
  12.  
  13.     public static void main(String[] args) throws Exception { 
  14.  
  15.         ExecutorService exec = Executors.newCachedThreadPool(); 
  16.  
  17.         final Semaphore semaphore = new Semaphore(3); 
  18.  
  19.         for (int i = 0; i < threadCount; i++) { 
  20.             final int threadNum = i; 
  21.             exec.execute(() -> { 
  22.                 try { 
  23.                     semaphore.acquire(); // 獲取一個(gè)許可 
  24.                     test(threadNum); 
  25.                     semaphore.release(); // 釋放一個(gè)許可 
  26.                 } catch (Exception e) { 
  27.                     log.error("exception", e); 
  28.                 } 
  29.             }); 
  30.         } 
  31.         exec.shutdown(); 
  32.     } 
  33.  
  34.     private static void test(int threadNum) throws Exception { 
  35.         log.info("{}", threadNum); 
  36.         Thread.sleep(1000); 
  37.     } 

執(zhí)行結(jié)果:如下圖所示,我們看到雖然結(jié)果是無(wú)序的,但是請(qǐng)求的線程數(shù)量是正確的,這里展示的是獲取一個(gè)許可,同時(shí)也釋放一個(gè)許可,我們可不可以獲取多個(gè)許可,釋放多個(gè)許可呢,答案是可以的


1.2 代碼演示:獲取多個(gè)許可證

  1. package com.mmall.concurrency.example.aqs; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4.  
  5. import java.util.concurrent.ExecutorService; 
  6. import java.util.concurrent.Executors; 
  7. import java.util.concurrent.Semaphore; 
  8.  
  9. @Slf4j 
  10. public class SemaphoreExample { 
  11.  
  12.     private final static int threadCount = 20; 
  13.  
  14.     public static void main(String[] args) throws Exception { 
  15.  
  16.         ExecutorService exec = Executors.newCachedThreadPool(); 
  17.  
  18.         final Semaphore semaphore = new Semaphore(3); 
  19.  
  20.         for (int i = 0; i < threadCount; i++) { 
  21.             final int threadNum = i; 
  22.             exec.execute(() -> { 
  23.                 try { 
  24.                     semaphore.acquire(3); // 獲取多個(gè)許可 
  25.                     test(threadNum); 
  26.                     semaphore.release(3); // 釋放多個(gè)許可 
  27.                 } catch (Exception e) { 
  28.                     log.error("exception", e); 
  29.                 } 
  30.             }); 
  31.         } 
  32.         exec.shutdown(); 
  33.     } 
  34.  
  35.     private static void test(int threadNum) throws Exception { 
  36.         log.info("{}", threadNum); 
  37.         Thread.sleep(1000); 
  38.     } 

執(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 代碼演示:

  1. import lombok.extern.slf4j.Slf4j; 
  2.  
  3. import java.util.concurrent.CountDownLatch; 
  4. import java.util.concurrent.ExecutorService; 
  5. import java.util.concurrent.Executors; 
  6.  
  7. @Slf4j 
  8. public class CountDownLatchExample1 { 
  9.  
  10.     private final static int threadCount = 200; 
  11.     public static void main(String[] args) throws Exception { 
  12.         int num = 0; 
  13.  
  14.         ExecutorService exec = Executors.newCachedThreadPool(); 
  15.         final CountDownLatch countDownLatch = new CountDownLatch(threadCount); 
  16.  
  17.         for (int i = 0; i < threadCount; i++) { 
  18.             final int threadNum = i; 
  19.             num++; 
  20.             exec.execute(() -> { 
  21.                 try { 
  22.                     test(threadNum); 
  23.                 } catch (Exception e) { 
  24.                     log.error("exception", e); 
  25.                 } finally { 
  26.                     countDownLatch.countDown(); 
  27.                 } 
  28.             }); 
  29.         } 
  30.         countDownLatch.await(); 
  31.         log.info("finish——"+num); 
  32.         exec.shutdown(); 
  33.     } 
  34.  
  35.     private static void test(int threadNum) throws Exception { 
  36.         Thread.sleep(100); 
  37.         log.info("{}", threadNum); 
  38.         Thread.sleep(100); 
  39.     } 

 

通過(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)求工具。

 

責(zé)任編輯:姜華 來(lái)源: 牧小碼農(nóng)
相關(guān)推薦

2017-01-09 16:06:19

2023-12-14 07:36:16

Java并發(fā)原子類

2023-02-10 09:40:36

Go語(yǔ)言并發(fā)

2012-03-06 11:01:44

Java

2024-11-13 15:09:57

Java線程開(kāi)發(fā)

2017-02-14 10:00:19

Java開(kāi)發(fā)Lock

2024-01-31 08:50:41

Guava并發(fā)工具

2014-07-02 09:37:02

模擬并發(fā)并發(fā)

2024-04-22 09:30:24

2019-07-25 12:46:32

Java高并發(fā)編程語(yǔ)言

2020-02-18 14:05:47

模擬并發(fā)Java

2024-09-06 10:48:13

2010-06-08 18:53:43

UML建模工具

2023-10-18 15:19:56

2019-11-19 09:00:38

JavaAND信號(hào)量

2011-08-15 11:13:06

IOS開(kāi)發(fā)并發(fā)Dispatch Qu

2012-07-06 15:00:03

跨平臺(tái)工具MoSync

2012-07-06 15:08:14

跨平臺(tái)工具Netbiscuits

2010-01-28 17:18:08

Android模擬器s

2022-10-12 07:53:46

并發(fā)編程同步工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)