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吗?
答案 0 :(得分:8)
由于您链接到自己的API文档已经指出
<强> getThreadCpuTime 强>
如果实现有区别 在用户模式时间和系统模式之间 时间,返回的CPU时间是 线程的时间量 在用户模式或系统模式下执行。
如果JVM的实现区分用户模式和内核模式时间,则两个函数的结果可能会有所不同。
此外,该值仅精确到纳秒,并且如果偏移> 1,则该值具有溢出问题。 2 ^ 63。 JVM还必须支持测量当前线程的CPU时间,并且必须启用它。
在Win32上,返回值应与从GetThreadTimes Function
获得的值相同 getThreadUserTime()
- &gt; lpUserTime * 100
//或类似的东西
getThreadCpuTime()
- &gt; (lpKernelTime + lpUserTime) * 100
//或类似的东西
更清楚地提及User Mode vs Kernel Mode
答案 1 :(得分:-1)
在javadocs中解释: - )。
getThreadCpuTime: 返回指定ID的线程的总CPU时间。
getThreadUserTime: 返回指定ID的线程在用户模式下执行的CPU时间。
不同之处在于getThreadCpuTime还包括线程使用CPU但未处于用户模式的时间。这就像是在设备驱动程序内部,轮询I / O或类似事件。