【问题标题】:how to get actual thread execution time in java如何在java中获取实际的线程执行时间
【发布时间】:2020-05-10 06:37:59
【问题描述】:

我正在尝试测量线程执行所需的时间。 我创建了一个示例程序

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class Sample {
public static void main(String[] args ) {
    ThreadPoolExecutor exec = (ThreadPoolExecutor)Executors.newFixedThreadPool(1000);
    for(int i=0; i<1000; i++) {
        exec.execute(new Runnable() {
            @Override
            public void run() {
                long start = System.currentTimeMillis();
                try{
                    Thread.sleep(10000);
                } catch(Exception ex) {
                    ex.printStackTrace();
                }
                long end = System.currentTimeMillis();
                System.out.println("[Sample] Thread id : " + Thread.currentThread().getId() + ", time : " + (end - start));
            }
        });
    }
}

}

每个线程休眠 10 秒。所以持续时间 = (end - start) 应该是 10000。但是有些线程花费的时间比预期的要多。我猜这还包括线程切换时间和阻塞时间。有没有办法在JAVA中测量线程程序的执行时间?

问题是我有一个在线程中进行网络调用的程序。所以即使套接字超时是 60 秒,线程执行时间也接近 2 分钟。我的猜测是,上述计算执行时间的方式也考虑了线程切换时间和阻塞时间。它没有测量实际的线程执行时间

谢谢。

【问题讨论】:

  • Thread.sleep 不能保证正好休眠十秒。它至少休眠十秒钟。你为什么不想测量它所花费的实际执行时间?您到底想测量什么?
  • 嘿!您已经测量了执行时间。问题出在哪里?
  • @akuzminykh 问题是我有一个程序可以在线程中进行网络调用。所以即使套接字超时是 60 秒,线程执行时间也接近 2 分钟。我的猜测是,上述计算执行时间的方式也考虑了线程切换时间和阻塞时间。它没有测量实际的线程执行时间
  • 你的意思是,你想测量线程处于运行状态的时间?我认为没有任何方法可以从 Java 代码本身中(精确地)衡量这一点。
  • 我认为,您应该展示正在执行网络调用的代码,并询问为什么它的执行时间比您预期的要长,而不是询问线程。如果您想听从我的建议,请创建另一个问题。

标签: java multithreading executorservice


【解决方案1】:

对于这种情况,我使用JavaVisualVM,它是一个非常方便的工具来查找并发问题。 我在本地运行了您的代码,这就是视觉 VM 向我展示的内容。

所有线程的睡眠时间完全相同,因此我们在控制台日志中看到的差异可能具有误导性。

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多