前言:以往我们测试并发就是for循环创建线程,去跑程序,但那真的是在模拟并发环境吗?其实并不是,并发环境的真实场景应该是多个线程同时跑,同时就很重要。
我结合java函数编程写了如下测试类,仅供参考。
package com.delicacy.oatmeal.idworker;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
/**
* 并发测试工具类
*
* @author zyt
* @create 2018-04-27 18:56
**/
public class ConcurrentTestUtil {
private static final int THREADNUM = 100;
public static <T> void test(T t,Consumer<T> consumer,int threadNum){
CountDownLatch countDownLatch = new CountDownLatch(threadNum);
for (int i=0;i<threadNum;i++){
new Thread(()->{
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
consumer.accept(t);
}).start();
countDownLatch.countDown();
}
}
public static <T> void test(T t,Consumer<T> consumer){
test(t,consumer,THREADNUM);
}
}
@Test
public void contextLoads() {
ConcurrentTestUtil.test(new IdWorker(1), s -> {
System.out.println(s.nextId());
}, 10000);
}