您的位置:首页 > 其它

一个测试任务并发执行时间的方法

2017-04-16 17:53 323 查看
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;

/**
* Created by xuyizhen on 2017/4/16.
*/
public class Util {
/**
* 测试任务task在指定的线程池execurtor中的并发度与性能的关系
* 注意:线程池中的线程数必须不小于并发度,否则将导致线程饥饿死锁
*
* @param executor
* @param concurrency
* @param task
* @return
*/
public static long timeTest(Executor executor, int concurrency, final Runnable task) throws InterruptedException {
final CountDownLatch allReady = new CountDownLatch(concurrency);
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch allOver = new CountDownLatch(concurrency);

for (int i = 0; i < concurrency; i++) {
executor.execute(new Runnable() {
public void run() {
allReady.countDown();
try {
start.await();
task.run();
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();//使该断言能被Executor感知到
} finally {
allOver.countDown();
}
}
});
}
allReady.await();
long startTime = System.nanoTime();
start.countDown();
allOver.await();
long endTime = System.nanoTime();
return endTime - startTime;
//对于这种测试时间间隔的定时,要使用nanoTime而非currentTimeMills。因为前者更加准确并且不受实时时钟的影响。
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: