小标
2018-12-04
来源 :
阅读 2625
评论 0
摘要:本文主要向大家介绍了Java语言代码模拟并发请求对接口进行压测(代码实例),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本文主要向大家介绍了Java语言代码模拟并发请求对接口进行压测(代码实例),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
案例:编写一段代码,模拟并发请求为20,且总的请求数为1000,当1000个请求完成之后,打印“请求完成”。
实现代码:
/**
* 目标:编写一段代码,模拟并发请求为20,且总的请求数为1000,当1000个请求完成后,打印“请求完成”
*/
@Slf4j
public class TestConcurrentRequest {
// 总的请求个数
public static final int requestTotal = 1000;
// 同一时刻最大的并发线程的个数
public static final int concurrentThreadNum = 20;
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(requestTotal);
Semaphore semaphore = new Semaphore(concurrentThreadNum);
for (int i = 0; i< requestTotal; i++) {
executorService.execute(()->{
try {
semaphore.acquire();
String result = testRequestUri();
log.info("result:{}.", result);
semaphore.release();
} catch (InterruptedException e) {
log.error("exception", e);
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
log.info("请求完成");
}
private static String testRequestUri() {
return HttpClientUtil.get("https://localhost:8080/test");
}
}
注意:上述代码中,countDownLatch.countDown();需要放在每个线程中进行countDownLatch.countDown(),而不能通过主线程来执行countDownLatch.countDown();
输出打印日志为:
Connected to the target VM, address: '127.0.0.1:62593', transport: 'socket'
[pool-1-thread-12] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-4] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-9] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
...
[pool-1-thread-944] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-997] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-976] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-926] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-999] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[main] INFO com.example.concurrent.TestConcurrentRequest - 请求完成
可以看到,当大概1000个请求发送完成之后,才打印“请求完成”。
由于我们使用的是: ExecutorService executorService = Executors.newCachedThreadPool();因此,会不断的创建新的线程。如果改为:ExecutorService executorService = Executors.newFixedThreadPool(concurrentThreadNum);
则输出日志为:
[pool-1-thread-18] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-8] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-4] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-6] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
...
[pool-1-thread-1] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-7] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-14] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-16] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-12] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[pool-1-thread-3] INFO com.example.concurrent.TestConcurrentRequest - result:test2.
[main] INFO com.example.concurrent.TestConcurrentRequest - 请求完成
可以看到,线程[pool-1-thread-3]被复用了。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
喜欢 | 1
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号