目录
1.应用场景:
2.模拟实现思路:
3.代码示例
1.应用场景:
日常开发人员,可能自己写完接口之后,对于一些重要的接口需要进行并发的控制,一旦出现并发导致系统正常业务,或者数据出现错误,那应该是我们最不想看到的结果。
这里可能有人会说,有专门的压测工具,但是压测是主要用来测试吞吐量的。
我这里主要是想验证程序的正常业务逻辑是否符合程序设计的预期业务逻辑。所以侧重点儿不一样,而且作为一个开发人员,想要自己测试自己的程序,我个人觉得自己编码测试,是最直接有效的方式。
2.模拟实现思路:
- 线程池并发请求:ThreadPoolExecutor
- Jdk的计数器,控制并发请求开始时间点儿。
CountDownLatch :计数器的作用,大白话给大家讲解一下,类似于赛道上有多个运动员同时准备起跑时,那个发令枪的作用,枪一响起跑线上的运动员同时开跑。
3.代码示例
代码语言:javascript复制package com.xxx.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestMultiUserReq {
public static void main(String[] args) throws Exception {
//线程池设置2000个核心线程数,最大5000
ThreadPoolExecutor executor = new ThreadPoolExecutor(2000, 5000, 2, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(5000));
//设置计数器,计数器的作用:类似于赛道上有多个运动员同时准备起跑时,那个发令枪的作用,枪一响起跑线上的运动员同时开跑
CountDownLatch latch = new CountDownLatch(1);
//模拟100个用户
int userCount = 100;//同一时间请求的用户数量
for (int i = 0; i < userCount; i ) {
ClientUser analogUser = new ClientUser(latch);
executor.execute(analogUser);
}
//计数器減一 所有线程释放 并发访问。
latch.countDown();
executor.shutdown();
}
static class ClientUser implements Runnable {
CountDownLatch latch;
public ClientUser(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
long starTime = 0;
try {
starTime = System.currentTimeMillis();
latch.await();
System.out.println("开始请求接口============");
//这里写你请求的接口逻辑代码
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
Long t = endTime - starTime;
System.out.println("耗时:" t / 1000F "秒");
}
}
}
感觉对您有帮助的话,帮小编点个免费的赞吧!