如何在Java中度量多线程任务的执行时间

bihw5rsg  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(170)

我有一个方法,让我们说100k http调用API,因此,我同时进行http调用,以避免http瓶颈.但我也希望在不阻塞任何线程的情况下对整个方法计时.

ExecutorService service = Executors.newFixedThreadPool(500);
        for (int i = 0; i < 100_000; i++) {
            int finalI = i;
            Runnable runnable = () -> {
                // My http call goes here....
            };
            service.submit(runnable);
        }
dba5bblo

dba5bblo1#

如果你想大致了解整个操作所需的时间,那么先使用shutdown,然后使用awaitTermination,等待执行器服务完成所有提交的任务。

long start= System.nanoTime();
ExecutorService exec = Executors.newFixedThreadPool(100);
try {
    for (int i = 0; i < 100_000; i++) {
        final int x = i;
        Runnable runnable = () -> System.out.println(x);
        exec.submit(runnable);
    }
} finally {
    exec.shutdown();
    exec.awaitTermination(365, TimeUnit.DAYS);
}
long elapsed = System.nanoTime() - start;
System.out.println("Elapsed millisec "+TimeUnit.NANOSECONDS.toMillis(elapsed));

System.out.println或其他日志记录放在任务中并不是一个好主意,因为这样做只是对控制台I/O计时,而无法估计处理速度。
正如注解中所述,对同一组服务器/资源/磁盘使用多线程访问可能会使总体运行时间变长或在其他地方导致问题。
在JDK 19中,ExecutorServiceAutoCloseable,因此您可以简化try块并删除finally:

try (ExecutorService exec = Executors.newFixedThreadPool(100)) {
     ...
}

相关问题