6

ThreadMXBean 有两种检索线程时间使用情况的方法:

两者有什么区别?


更新 2:如果我能够链接到 javadocs,不要引用它们 - 我已经阅读过它们。

更新:这是我试图用来了解这些时间意味着什么的一些代码,但收效甚微:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
threadMXBean.setThreadContentionMonitoringEnabled(true);
long mainThreadId = getMainThreadId(threadMXBean);

logTimes("Start", threadMXBean, mainThreadId);

URL url = new URL("https://hudson.dev.java.net");
URLConnection connection = url.openConnection();

connection.getContent();

logTimes("After loading", threadMXBean, mainThreadId);

输出是:

Start Tue Jun 16 16:13:40 EEST 2009 Cpu time : 80, user time: 60, waited: 0, blocked: 0
After loading Tue Jun 16 16:13:43 EEST 2009 Cpu time : 1,020, user time: 960, waited: 0, blocked: 0

所以 cpu 和用户时间之间的差异从 20 毫秒增加到了 60 毫秒。那是因为使用 HttpUrlConnection 确实包含一些网络 I/O?

4

2 回答 2

9

正如您链接到自己的 API 文档已经指出的那样

获取线程CPU时间

如果实现区分用户模式时间和系统模式时间,则返回的 CPU 时间是线程在用户模式或系统模式下执行的时间量。

如果 JVM 的实现区分了用户模式和内核模式时间,那么这两个函数的结果可能会有所不同。

此外,该值仅精确到纳秒,如果偏移量 > 2^63,则该值存在溢出问题。JVM 还必须支持测量当前线程的 CPU 时间,并且必须启用它。

在 Win32 上,返回值应该与从GetThreadTimes 函数获得的相同

getThreadUserTime()-> lpUserTime * 100//或类似的东西

getThreadCpuTime()-> (lpKernelTime + lpUserTime) * 100//或类似的东西

以及对用户模式与内核模式的更清晰参考

于 2009-06-16T12:49:12.307 回答
-1

它在 javadocs 中进行了解释:-)。

getThreadCpuTime:返回指定 ID 的线程的总 CPU 时间。

getThreadUserTime:返回指定ID的线程在用户态执行的CPU时间。

不同之处在于 getThreadCpuTime 还包括线程使用 CPU 但未处于用户模式的时间。这就像在设备驱动程序中,轮询 I/O 或类似的事情。

于 2009-06-16T12:50:33.940 回答