标签:封装 方便使用 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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。