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("http://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]被复用了。

猜你喜欢

转载自blog.csdn.net/timchen525/article/details/80369763