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

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频道!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值