【发布时间】: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