package cn.org.rapid_framework.test.util;
import java.util.concurrent.CountDownLatch;
/**
* 多线程测试的工具类,可以根据指定的线程数并发的同时执行同一个task用于单元测试使用
* @author badqiu
*/
public class MultiThreadTestUtils {
/**
* 执行测试并等待执行结束,返回值为消耗时间
*
* @param threadCount 线程数
* @param task 任务
* @return costTime
* @throws InterruptedException
*/
public static long executeAndWait(int threadCount,final Runnable task) throws InterruptedException {
CountDownLatch doneSignal = execute(threadCount, task);
long startTime = System.currentTimeMillis();
doneSignal.await();
return System.currentTimeMillis() - startTime;
}
/**
* 执行测试
*
* @param threadCount
* @param threadDemeon
* @param task
* @return 返回doneSignal
*/
public static CountDownLatch execute(int threadCount,final Runnable task) {
final CountDownLatch startSignal = new CountDownLatch(1);
final CountDownLatch startedSignal = new CountDownLatch(threadCount);
final CountDownLatch doneSignal = new CountDownLatch(threadCount);
for(int i = 0; i < threadCount; i++) {
Thread t = new Thread(){
public void run() {
startedSignal.countDown();
try {
startSignal.await();
}catch(InterruptedException e) {
return;
}
try {
task.run();
}finally {
doneSignal.countDown();
}
}
};
t.start();
}
try {
startedSignal.await();
} catch (InterruptedException e) {
//ignore
}
startSignal.countDown();
return doneSignal;
}
}