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。因为前者更加准确并且不受实时时钟的影响。 } }
一个测试任务并发执行时间的方法
最新推荐文章于 2023-08-18 20:48:39 发布