ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

并发测试工具类 封装,方便使用

2022-07-02 13:35:30  阅读:163  来源: 互联网

标签:封装 方便使用 int countDownLatch param new 测试工具 threadNum executorService


并发测试工具类 封装,方便使用

很多时候我们都想做一些并发测试,又不想用 JMeter ,ab等工具所以直接用代码写一个工具类

@Slf4j
public class MultiThreadConcurrentTestUtils {

	/**
	 * 多线程并发测试
	 * @param threadNum  线程数量
	 * @param consumer 函数
	 * @param param 消费参数
	 * @throws InterruptedException
	 */
	@SneakyThrows
	public static void multiThreadTest(int threadNum, Object param,Consumer consumer) {
		CountDownLatch countDownLatch = new CountDownLatch(threadNum);
		ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
		CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum);
		for (int i = 0; i < threadNum; i++) {
			executorService.execute(() -> {
				try {
					Thread.sleep(new Random().nextInt(60)*1000);
					cyclicBarrier.await();
					// 业务方法
					consumer.accept(param);
					log.info("线程:{} 开始执行",Thread.currentThread().getName());
					countDownLatch.countDown();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (BrokenBarrierException e) {
					e.printStackTrace();
				}
			});
		}
		countDownLatch.await();
		executorService.shutdown();
	}


	/**
	 * 多线程测试
	 * @param threadNum
	 * @param runnable
	 */

	@SneakyThrows
	public static void multiThreadTest(int threadNum, Runnable runnable) {
		CountDownLatch countDownLatch = new CountDownLatch(threadNum);
		ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
		CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum);
		for (int i = 0; i < threadNum; i++) {
			executorService.execute(() -> {
				try {
					Thread.sleep(new Random().nextInt(60)*1000);
					cyclicBarrier.await();
					// 业务方法
					runnable.run();
					log.info("线程:{} 开始执行",Thread.currentThread().getName());
					countDownLatch.countDown();
				} catch (Exception e) {
					e.printStackTrace();
				}
			});
		}
		countDownLatch.await();
		executorService.shutdown();
	}
}

使用

  List<Integer> list = new ArrayList<>();

    List<Integer> copyList = new CopyOnWriteArrayList<>();
    @Test
    public void testDistributedLock() {
        MultiThreadConcurrentTestUtils.multiThreadTest(10,"test",(e) ->{
            for (int i = 0; i < 10; i++) {
                copyList.add(i);
            }
        });

        System.out.println("copyList "+copyList.size());
        MultiThreadConcurrentTestUtils.multiThreadTest(10,() -> {
            for (int i = 0; i < 10; i++) {
                list.add(i);
            }
        });

        System.out.println("list "+ list.size());
    }

可见 ArrayList 线程不安全,CopyOnWriteArrayList 线程安全

标签:封装,方便使用,int,countDownLatch,param,new,测试工具,threadNum,executorService
来源: https://www.cnblogs.com/lyc88/p/16437112.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有