ThreadMXBean.getThreadCpuTime()是否包括在所有状态中花费的时间,或者只是RUNNABLE?

时间:2012-06-08 07:36:54

标签: java multithreading jmx

就像主题所说,它是否包括在BLOCKED和WAITING等中花费的时间,状态,还是这只是RUNNABLE?文档只是说“cpu time”,这有点模糊......

3 个答案:

答案 0 :(得分:3)

ThreadMXBean.getThreadCpuTime()仅包括在RUNNABLE状态下花费的时间,但请注意,计算方式取决于平台。

这是一个程序,它显示getThreadCpuTime()仅涵盖线程实际执行某些操作的时间:

import java.lang.management.*;

public class Test implements Runnable {
    public static void main(String[] args)
        throws Exception {

        long time = System.nanoTime();
        Test test = new Test();
        synchronized (test) {
            new Thread(test).start();
            while (test.cpu == -1) {
                test.wait();
                }
            }
        System.out.println("time: " + (System.nanoTime() - time));
        System.out.println("cpu: " + test.cpu);
        }

    private long cpu = -1;

    public synchronized void run() {
        try {
            ThreadMXBean thread = ManagementFactory.getThreadMXBean();
            long cpu = thread.getCurrentThreadCpuTime();
            Thread.sleep(300);
            long time = System.nanoTime();
            while (System.nanoTime() - time < 700000000);
            this.cpu = thread.getCurrentThreadCpuTime() - cpu;
            }
        catch (InterruptedException _) {}
        finally {
            notify();
            }
        }
    }

答案 1 :(得分:1)

是的,这只是RUNNABLE,您可以通过以下方法通过ThreadInfo接收其他州的时间进一步统计数据:

TIMED_WAITING中的WAITINGgetWaitedTime()之间没有进一步的歧视。

答案 2 :(得分:0)

仅限Runnable。就是这样,否则就没用了。